【基于spark IM 的二次开发笔记】第二天 树形结构
- MessageTreePlugin.java
- final MessageTreeTab messageTreeTab = new MessageTreeTab();
- /**
- * Adds a tab to Spark
- */
- private void addTabToSpark(){
- // Get Workspace UI from SparkManager
- Workspace workspace = SparkManager.getWorkspace();
- // Retrieve the Tabbed Pane from the WorkspaceUI.
- SparkTabbedPane tabbedPane = workspace.getWorkspacePane();
- // Add own Tab.
- tabbedPane.addTab("消息", null,<SPAN style="COLOR: #ff0000">messageTreeTab</SPAN>);
- //messageTreeTab.invokeDialog();
- }
- MessageTreeTab.java
- public class MessageTreeTab extends JPanel {
- private static final long serialVersionUID = -381458717030745122L;
- private JiveTreeNode msgType;
- private List<JiveTreeNode> groupNodes = new ArrayList<JiveTreeNode>();
- private MessageTree msgTree;
- private JiveTable messageType;
- public MessageTreeTab(){
- setLayout(new GridBagLayout());
- msgType = new JiveTreeNode("分类");
- msgTree = <SPAN style="COLOR: #ff0000">new MessageTree</SPAN>(msgType);
- msgTree.setPreferredSize(new Dimension(150, 400));
- String groupName = Res.getString("status.online");
- String[] headers = new String[]{"类型","时间","内容"};
- messageType = new JiveTable(headers, null);
- messageType.setPreferredSize(new Dimension(350, 400));
- final JScrollPane pane = new JScrollPane(messageType);
- pane.setBorder(BorderFactory.createTitledBorder(Res.getString("label.message").replace("&", "")));
- final JScrollPane treePane = new JScrollPane(msgTree);
- treePane.setBorder(BorderFactory.createTitledBorder(Res.getString("message.send.to.these.people")));
- // treePane.getVerticalScrollBar().setBlockIncrement(200);
- // treePane.getVerticalScrollBar().setUnitIncrement(20);
- // Add to UI
- add(treePane, new GridBagConstraints(0, 0, 1, 1, 0.5, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 0), 0, 0));
- add(pane, new GridBagConstraints(1, 0, 1, 3, 0.5, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(2, 0, 2, 5), 0, 0));
- msgTree.expandTree();
- }
- /**
- * Displays the message tree dialog.
- */
- public void invokeDialog() {
- JiveTreeNode groupNode = new JiveTreeNode("通知类型1");
- groupNode.add( new JiveTreeNode("通知类型11"));
- groupNode.add(new JiveTreeNode("通知类型12"));
- groupNode.add(new JiveTreeNode("通知类型13"));
- groupNode.add(new JiveTreeNode("通知类型14"));
- groupNode.add(new JiveTreeNode("通知类型15"));
- JiveTreeNode groupNode2 = new JiveTreeNode("通知类型2");
- groupNode2.add( new JiveTreeNode("通知类型21"));
- groupNode2.add(new JiveTreeNode("通知类型22"));
- groupNode2.add(new JiveTreeNode("通知类型23"));
- groupNode2.add(new JiveTreeNode("通知类型24"));
- groupNode2.add(new JiveTreeNode("通知类型25"));
- msgType.add(groupNode);
- msgType.add(groupNode2);
- }
- }
- MessageTree.java
- public class MessageTree extends JPanel {
- private static final long serialVersionUID = 5992552368286729600L;
- private Tree tree;
- public MessageTree(JiveTreeNode rootNode) {
- tree = new Tree(rootNode);
- tree.setCellRenderer(new DefaultTreeCellRenderer());
- tree.setRowHeight(18);
- tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- tree.setToggleClickCount(1000);
- tree.putClientProperty("JTree.lineStyle", "Angled");
- tree.addMouseListener(new NodeSelectionListener(tree));
- setLayout(new BorderLayout());
- add(tree);
- }
- class NodeSelectionListener extends MouseAdapter {
- JTree tree;
- NodeSelectionListener(JTree tree) {
- this.tree = tree;
- }
- public void mouseClicked(MouseEvent e) {
- int x = e.getX();
- int y = e.getY();
- int row = tree.getRowForLocation(x, y);
- TreePath path = tree.getPathForRow(row);
- if (path != null) {
- JiveTreeNode node = (JiveTreeNode)path.getLastPathComponent();
- if (!node.isLeaf()) {
- tree.expandPath(path);
- }
- else {
- tree.collapsePath(path);
- }
- ((DefaultTreeModel)tree.getModel()).nodeChanged(node);
- // I need revalidate if node is root. but why?
- tree.revalidate();
- tree.repaint();
- }
- }
- }
- public JTree getTree() {
- return tree;
- }
- /**
- * Call to expand the entire tree.
- */
- public void expandTree() {
- for (int i = 0; i <= tree.getRowCount(); i++) {
- tree.expandPath(tree.getPathForRow(i));
- }
- }
- }
效果图:

【基于spark IM 的二次开发笔记】第二天 树形结构的更多相关文章
- 【基于spark IM 的二次开发笔记】第一天 各种配置
[基于spark IM 的二次开发笔记]第一天 各种配置 http://juforg.iteye.com/blog/1870487 http://www.igniterealtime.org/down ...
- 提供基于Lesktop的IM二次开发,联系QQ:87172811
提供基于Lesktop的IM二次开发,联系QQ:87172811
- phpcms二次开发笔记
phpcms二次开发笔记 --soulsjie 以下载的全新的phpcms搭建一个新的站点为例,讲解如何利用phpcms进行二次开发 一.下载和安装phpcms http://www.phpcms.c ...
- 研究QGIS二次开发笔记(一)
为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事.选型阶段真是呵呵.我折腾的是QGIS2.4.0. 首先,到官方网站下载安装QGIS.如果你跟我一样懒的话,可能希望下载一个已经编译好的win ...
- RTX二次开发笔记2
问题一:关于DLL文件的引用 在安装文件夹内 APIObject.dll==>RTXSAPI.dll 服务器API接口 RTXCAPI.DLL ==> 客户端API接口 问题二:RTX二次 ...
- 基于leveldb,levigo做二次开发
Leveldb是一个C++库,它有提供标准的C接口,头文件在include/leveldb/c.h中 levigo是leveldb 的一个go wrapper,它主要基于Leveldb中inlude/ ...
- OTRS 二次开发笔记
公司使用otrs系统处理业务工单,各种事件流.因为是开源免费系统,因此需要在上面做一些功能补充或定制的二次开发. otrs是什么? OTRS 是一个功能强大的工单系统.完美适用于服务台(Help De ...
- (dede)织梦系统二次开发笔记
(dede)织梦系统二次开发记录 --soulsjie 一.模板常用文件说明 模板文件都在文件夹templets下,我们以默认模板(default)为例,对模板文件结构进行分析: 首页模板文件目录 \ ...
- 派胜OA二次开发笔记(1)重写主界面
最近从派胜OA 2018 升级到 2019,为了二次开发方便,索性花了两天,反向分析 PaiOA 2019 主界面程序,重写大部分代码,方便对菜单权限进行控制. 主界面/core/index.aspx ...
随机推荐
- 设计模式之开篇(C#语法)
很长时间没有写文章了,前段时间写的C#语法糖分享得到有很多朋友支持,这个也使得我有信心继续分享下去,在这里非常感谢大家!这次开始给大家分享一下设计模式,我个人觉得设计模式也对于我们提高个人技术水平来说 ...
- MongoDB笔记(一)MongoDB概述和安装
概述 关键词:关系数据库.非关系数据库 关系数据库: 关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据.目前主流的关系数据库有oracle.SQL.ac ...
- [java bug记录] java.util.zip.ZipException: invalid code lengths set
1. 描述:将代码迁移到maven工程,其中用ZipInputStream读取/src/main/resources下的zip文件时报错:“java.util.zip.ZipException: in ...
- C#面向对象的学习笔记
1.面向对象的3要素: 封装:将不需要显示的代码封装到一个方法中,只对外提供方法名,用户不需关心内部实现. 继承:子类继承父类,公用父类的代码,大大提高了代码的重用,贴近生活也符合人类的编程思想. 多 ...
- js 中用Dom2级事件处理函数(改变样式)
下面这些客户端 javascript代码用到了事件,它给一个很重要的事件--“load" 事件注册了一个事件处理程序.同时展示了注册”click“事件处理函数更高级的一种方法 <!do ...
- js 中如何通过提示框跳转页面
通过提示框跳转页面 <!doctype html> <html lang="en"> <head> <meta charset=" ...
- Eyeshot Ultimate 学习笔记(4)
动画 Eyeshot的官方Demo中有一个功能是近期项目需要用到的,就是动画效果.其中主要运用到BlockReference类,该类下的两个方法MoveTo(Dictionary<string, ...
- 【 java版坦克大战--绘图技术】 绘制坦克
通过上一节,我们学会的用java绘图.那现在就用java绘制自己坦克. 首先通过分析坦克由这几部分组成.如图 各个部件的长宽如图.15,10为圆心. /** * 坦克游戏的1.0版 * 1.画出坦克 ...
- 丢沙包游戏(或杀人游戏)的C语言实现
丢沙包游戏(或杀人游戏)用C语言实现: 游戏简述: 杀人游戏(或者丢沙包游戏),设定一些人(人数为:num)一起玩游戏,从某个指定的人(设定为:start)开始轮流扔沙包,扔沙包人的下一个人为1,每隔 ...
- uboot start.S分析
一.概述 1.本文综述及特色 阅读uboot,start.S是第一个源程序文件,主要完成初始化看门狗.定时器.重定位(拷贝代码段到内存中).初始化堆栈.跳转到第二阶段等工作. 网上关于这些内容的 ...