当前位置:  技术问答>java相关

两棵树之间的同步大家做过吗?高分求知!

    来源: 互联网  发布时间:2015-02-08

    本文导语:  情况是我有两棵同样的树,我想在jTree1选择时同步选择jTree2的同样的结点。 所以我在jTree1的valueChange方法中处理,     TreePath tp = jTree1.getSelectionPath();     jTree2.setSelectionPath(tp);     jTree2.makeVisible(tp); 但是jTree2似乎一...


情况是我有两棵同样的树,我想在jTree1选择时同步选择jTree2的同样的结点。

所以我在jTree1的valueChange方法中处理,

    TreePath tp = jTree1.getSelectionPath();
    jTree2.setSelectionPath(tp);
    jTree2.makeVisible(tp);

但是jTree2似乎一点变化也没有,如何做?请高手指点一下吧。

其实jTree2已选中了相应的结点,我在jTree2的选中事件中如果输出它当前被选中的结点,的确是与jTree1选中的一样。说明jTree2被改变了,但是界面上不会有变化,为什么?

我试过 expandSelectedPath,invalidate,等等方法,都没用。

|
try it

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class Learn extends JFrame {

    JTree tree1 = new JTree();
    JTree tree2 = new JTree();

    public Learn(){


        tree1.addTreeExpansionListener(new TreeExpansionAction1());
        tree2.addTreeExpansionListener(new TreeExpansionAction2());

        ScrollPane sPaneLeft = new ScrollPane();
        ScrollPane sPaneRight = new ScrollPane();
        this.getContentPane().add(sPaneLeft,BorderLayout.WEST);
        this.getContentPane().add(sPaneRight,BorderLayout.EAST);
        sPaneLeft.add(tree1);
        sPaneRight.add(tree2);
        this.pack();
        this.setVisible(true);
    }

    class TreeExpansionAction1 implements TreeExpansionListener{
        public void treeCollapsed(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 1 collapsed : " + path.toString());
        }

        public void treeExpanded(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 1 expanded : " + path.toString());
            int row = tree1.getRowForPath(path);
            tree2.expandRow(row);
        }
    }

    class TreeExpansionAction2 implements TreeExpansionListener{
        public void treeCollapsed(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 2 collapsed : " + path.toString());
        }

        public void treeExpanded(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 2 expanded : " + path.toString());
            int row = tree2.getRowForPath(path);
            tree1.expandRow(row);
        }
    }

    public static void main(String[] args) {
        new Learn();
    }
}

|
感谢gtlang78()的提示,如下代码实现了利用model和treepath来完成同步的动作
注意构造函数的第一行,将两个tree的model设为相同,以后就很方便的实现了两棵树的同步。
我觉得这种方法才真正解决了sharetop(天生不笨)的问题,建议给gtlang78()加分

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class Tree extends JFrame {

    JTree tree1 = new JTree();
    JTree tree2 = new JTree();

    public Tree(){
        tree2.setModel(tree1.getModel());

        tree1.addTreeExpansionListener(new TreeExpansionAction1());
        tree2.addTreeExpansionListener(new TreeExpansionAction2());

        ScrollPane sPaneLeft = new ScrollPane();
        ScrollPane sPaneRight = new ScrollPane();
        this.getContentPane().add(sPaneLeft,BorderLayout.WEST);
        this.getContentPane().add(sPaneRight,BorderLayout.EAST);
        sPaneLeft.add(tree1);
        sPaneRight.add(tree2);
        this.pack();
        this.setVisible(true);
    }

    class TreeExpansionAction1 implements TreeExpansionListener{
        public void treeCollapsed(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 1 collapsed : " + path.toString());
            tree2.collapsePath(path);
        }

        public void treeExpanded(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 1 expanded : " + path.toString());
            tree2.expandPath(path);
        }
    }

    class TreeExpansionAction2 implements TreeExpansionListener{
        public void treeCollapsed(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 2 collapsed : " + path.toString());
            tree1.collapsePath(path);
        }

        public void treeExpanded(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            System.out.println("tree 2 expanded : " + path.toString());
            tree1.expandPath(path);
        }
    }

    public static void main(String[] args) {
        new Tree();
    }
}

|
可以让两棵树使用同一个选择模型,只需两行代码

TreeSelectionModel model = jTree1.getSelectionModel();
jTree2.setSelectionModel(model);

还有很多其他的Swing组件可以用类似的方法同步,例如JSlider,JProgressBar,JList等

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux服务器之间如何实现时间同步?
  • 求一个多进程之间的同步算法?
  • redhat NFS的client与server之间无法同步
  • 数据库中两张表之间的数据同步增加、删除与更新实现思路
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换
  • 求救,linux和windows之间如何联成局域网(设置),并且相互之间移动文件。
  • c/c++中的内存分配 malloc 和 new介绍及相互之间的区别
  • 请问jsp和serlet之间怎么通讯,jsp和jsp之间呢?
  • sql 取两值之间的数据方法(例:100-200之间的数据)
  • 使用ssh-keygen -t rsa建立密钥之后,可以实现两台linux主机之间的root用户免密码登陆。但无法实现两个普通用户之间免密码登陆
  • Linux网络编程(怎样实现两个客户端之间的通信)
  • 在java中,如何表达界于20和40之间?
  • 高分请教,applet和javabean之间如何通信? iis7站长之家
  • iptables如何限制同一个网段之间的通信
  • 使用tcp协议发送数据, 如果获得系统底层将包发到客户端之间的耗时?
  • vware如何在两个操作系统之间传送文件
  • com和ejb之间通讯
  • 求助java中如何在unicode和GBK2312之间转换
  • JSP页面之间怎样传递参数?
  • jsp(java)里面怎么求两个日期之间的天数?
  • 如何在页面之间传递参数,请举例!
  • 怎样精确设置GridLayout布局中每个小格之间的间隙???
  • instance,object,reference之间有什么区别与联系,我都糊涂了。
  • applet和javabean之间可以通信吗?
  • 请教gnome和kde之间的转换问题!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3