IDEA Plugin---种一棵好看的JTree

最近笔者在写一个用来Json格式化的IDEA插件,因为Swing的资料相对比较少,自己也没怎么学过,最后实现起来属实费了一些功夫,在此记录一下。

创建

public static void main(String[] args) {
    //创建节点
    DefaultMutableTreeNode defaultMutableTreeNode = new DefaultMutableTreeNode("this is parent");
    DefaultMutableTreeNode childrenNode = new DefaultMutableTreeNode("son");
    DefaultMutableTreeNode grandChildrenNode = new DefaultMutableTreeNode("grandson");
    DefaultMutableTreeNode anotherNode = new DefaultMutableTreeNode("this is another node");
    //添加子节点
    defaultMutableTreeNode.add(childrenNode);
    //子节点添加孙节点
    childrenNode.add(grandChildrenNode);
    defaultMutableTreeNode.add(anotherNode);
    JTree jTree = new JTree(defaultMutableTreeNode);

    JFrame jFrame = new JFrame();
    jFrame.add(jTree);
    jFrame.setVisible(true);
    jFrame.setSize(840, 270);
    //关闭窗口自动结束程序
    jFrame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we) {
            System.exit(0);
        }
    });
}

通过上面的代码,就可以快速创建一个JTree了,启动之后就是下面这个样子

image.png

展开合并监听事件

可以通过添加展开合并的监听事件(树膨胀监听器?)来实现展开或者合并树时,增加一些自定义功能

jTree.addTreeExpansionListener(new TreeExpansionListener() {
    //展开事件
    @Override
    public void treeExpanded(TreeExpansionEvent event) {
        System.out.println("我展开的是" + event.getPath().getLastPathComponent());
    }
    //收起事件
    @Override
    public void treeCollapsed(TreeExpansionEvent event) {
        System.out.println("我收起的是" + event.getPath().getLastPathComponent());

    }
});

event.getPath().getLastPathComponent()可以获取到当前展开的节点

刷新UI

有时我们需要动态添加节点,在添加之后需要调用刷新UI的api才会生效

defaultMutableTreeNode.add(new DefaultMutableTreeNode("i am a new one "));
//只有加上这行代码,才会显示出新的节点
jTree.updateUI();

⚠️ 注意:如果调用updateUI()是在其他线程中,需要使用SwingUtilities.invokeLater()

jTree.addTreeExpansionListener(new TreeExpansionListener() {
    @Override
    public void treeExpanded(TreeExpansionEvent event) {
        System.out.println("我展开的是" + event.getPath().getLastPathComponent());
        //这里不会报错
        SwingUtilities.invokeLater(() -> jTree.updateUI());
    }

    @Override
    public void treeCollapsed(TreeExpansionEvent event) {
        System.out.println("我收起的是" + event.getPath().getLastPathComponent());
        //这里会抛出空指针异常
        jTree.updateUI()

    }
});

换皮肤

如果不满足于默认的样式,比如节点的默认图标,怎么看怎么像一个文件管理系统,当我用来做一个json格式化工具时,就会怪怪的,这个时候就可以用到自定义渲染

创建自定义渲染器

继承DefaultTreeCellRenderer后,重写getTreeCellRendererComponent这个方法。此时,如果不想要这个很像文件管理器的图标,就可以像下面这样把图标取消掉

class MyRenderer extends DefaultTreeCellRenderer {

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

        Component component = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
        setIcon(null);
        return component;
    }
}

image.png

如果只是用来去除图标的话,还是有些大材小用了。上面的方法返回了一个Compnent,这时就可以制作一些自定义组件了

比如,可以返回一些按钮

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

    Component component = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    setIcon(null);
    return new JButton(value.toString());
}

image.png

一些文本框

image.png

又或是。。。一些五颜六色的东西

WechatIMG33146.png

本文的内容到这就结束了,如果觉得有帮助别忘了点个赞呀!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java漂亮的树形菜单制作实例(源码),森林状的关系图,文本域,用于显示点击的节点名称,使用了JTree,可以看作是一个jTree的用法演示实例。树形菜单应用广泛,这个Tree制作漂亮,相信会让很多朋友从中学习到实现的方法,效果如演示截图所示。下面是相关的代码片段:   DefaultMutableTreeNode root = new DefaultMutableTreeNode("设置"); //生成根节点   DefaultMutableTreeNode node1=new DefaultMutableTreeNode("常规"); //生成节点一   node1.add(new DefaultMutableTreeNode("默认路径")); //增加新节点到节点一上   node1.add(new DefaultMutableTreeNode("保存选项"));   root.add(node1); //增加节点一到根节点上   root.add(new DefaultMutableTreeNode("界面"));   root.add(new DefaultMutableTreeNode("提示声音"));   root.add(new DefaultMutableTreeNode("打印"));   JTree tree = new JTree(root); //得到JTree的实例   DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer)tree.getCellRenderer(); //得到JTree的Renderer   renderer.setLeafIcon(null); //设置叶子节点图标为空   renderer.setClosedIcon(null); //设置关闭节点的图标为空   renderer.setOpenIcon(null); //设置打开节点的图标为空   tree.addTreeSelectionListener(new TreeSelectionListener() {//选择节点的事件处理   public void valueChanged(TreeSelectionEvent evt) {   TreePath path = evt.getPath(); //得到选择路径   String info=path.getLastPathComponent().toString(); //得到选择的节点名称   jtfInfo.setText(info); //在文本域中显示名称   }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值