apple里左边是一个jtree,右边是一个jtable,请问如何才能做到点击jtree里的其中一个节点,jtable里的数据值就相对应的进行改变呢?如果有例子的可以提供一个例子吗?在网上找了都没有找到相关的.谢谢各位的帮忙,分虽不多,请帮忙回答!

解决方案 »

  1.   

    网上有相关的例子,http://java.sun.com/docs/books/tutorial/uiswing/examples/components/index.html
      

  2.   

    设计思路:首先你要了解JTree的机制,它的每个节点都可以存近一个自定义的object的,你可以把数据存进那个object里面,点击节点的时候写个监听事件获得节点的那个object数据,然后取值放到JTable里面去
      

  3.   

    针对JTree添加选取节点的监听事件,即addTreeSelectionListener(),在监听到选择节点改变事件时,根据Treenode节点信息更新JTable里面的内容即可
      

  4.   

    在点击事件里更新JTable里面的内容我也是这样做的,不过就是不刷新,刷新的代码与写上了的!可惜都是没有反映...
      

  5.   

    刚好在书上看到一个例子,
    通过删除JTable组件,然后再重新申请JTable对象并添加,来刷新JTable中的值
    代码如下:/* File CalendarBean.java
    *  author:***
    *  Date:2007-12-8 23:37
    *  返回某年某月的日历的字符串数组
    */
    import java.util.Calendar;
    public class CalendarBean{
    int year = 2007,month = 0;
    private int monthDays[] = {31,28,31,30,31,30,31,31,30,31,30,31};

    //设置年份
    public void setYear(int year){
    this.year = year;
    }

    //获取年份
    public int getYear(){
    return year;
    }

    //设置月份
    public void setMonth(int month){
    this.month = month > 0 ? month : 1;
    }

    //获取月份
    public int getMonth(){
    return month;
    }

    //判断是否为闰年
    private static boolean isLeap(int year){
    return ((year % 4 == 0) && (year %100 == 0)) || (year % 400 == 0);
    }

    //获得当前年月的日历所组成字符串数组
    public String[][] getCalendar(){
    String data[][] = new String[6][7];

    Calendar cale = Calendar.getInstance();
    cale.set(year, month -1 ,1); //该月1号是星期几
    int weekDay = cale.get(Calendar.DAY_OF_WEEK) - 1;

    //该月的天数
    int day = monthDays[month - 1];
    if(month == 2 && isLeap(year)) day = 29;

    int nextDay = 1;

    //添加字符串数组
    for(int k = 0 ; k < 6; k++){
    if( k == 0)
    for(int j = weekDay; j < 7;j++){
    data[k][j] = " " + nextDay;
    nextDay++;
    }
    else 
    for(int j = 0 ; j < 7 && nextDay <= day; j++){
    data[k][j] = " " + nextDay;
    nextDay++;
    }
    }
    return data;
    }

    }/* File CalenderFrame.java
    *  author:***
    *  Date:2007-12-8 23:37
    *  一个简单的日历
    */
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;public class CalenderFrame extends JFrame implements ItemListener, TreeSelectionListener{
    JTable table;
    JTree tree = null;
    DefaultMutableTreeNode root;
    Object name[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    JComboBox yearList;
    CalendarBean cale;
    String rili[][];
    String item[] = {"2006","2007","2008","2009","2010"};
    JSplitPane split;
    int year = 2006;
    int month = 0;
    JScrollPane scrollTree,scrollTable;

    public CalenderFrame(){
    cale = new CalendarBean();

    //添加年份列表
    yearList = new JComboBox();
    for(int k = 0 ; k < item.length;k++)
    yearList.addItem(item[k]);
    yearList.addItemListener(this);

    //添加月份树
    root = new DefaultMutableTreeNode(item[0]);
    tree = new JTree(root);
    add(new JScrollPane(tree) , BorderLayout.WEST);
    tree.addTreeSelectionListener(this);

    //设置年月及该月日历
    cale.setYear(year);
    cale.setMonth(month);
    rili = cale.getCalendar();
    table = new JTable(rili,name);

    //添加到窗口
    scrollTree = new JScrollPane(tree);
    scrollTable = new JScrollPane(table);
    split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,scrollTree,scrollTable);
    add(yearList,BorderLayout.NORTH);
    add(split , BorderLayout.CENTER);
    updateYear(year);

    //设置窗口属性
    setSize(580,350);
    setVisible(true);
    split.setDividerLocation(0.5);
    validate();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    //更新年份及月份树
    private void updateYear(int year){
    cale.setYear(year);
    root = new DefaultMutableTreeNode(String.valueOf(year));

    DefaultMutableTreeNode months[] = new DefaultMutableTreeNode[13];
    for(int i = 0 ; i <12;i++){
    months[i] = new DefaultMutableTreeNode("" + (i+1));
    root.add(months[i]);
    }

    split.remove(scrollTree);
    tree = new JTree(root);
    tree.addTreeSelectionListener(this);
    scrollTree = new JScrollPane(tree);
    split.add(scrollTree , JSplitPane.LEFT);
    split.setDividerLocation(0.5);
    validate();
    }

    //年份列表的监听器 
    public void itemStateChanged(ItemEvent e){
    String yearStr = yearList.getSelectedItem().toString().trim();
    int year = Integer.parseInt(yearStr); updateYear(year);
    }

    //树结点的监听器
    public void valueChanged(TreeSelectionEvent e){
    DefaultMutableTreeNode monthNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    if(monthNode.isLeaf()){
    month = Integer.parseInt(monthNode.toString().trim());
    cale.setMonth(month);
    rili = cale.getCalendar();
    split.remove(scrollTable);
    table = new JTable(rili,name);
    scrollTable = new JScrollPane(table);
    split.add(scrollTable, JSplitPane.RIGHT);
    split.setDividerLocation(0.5);
    validate();
    }

    }

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

  6.   

    不好意思,第二个文件没帖好,重帖了下
    /* File CalenderFrame.java
    *  author:***
    *  Date:2007-12-8 23:37
    *  一个简单的日历
    */
    import javax.swing.*;
    import javax.swing.tree.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;public class CalenderFrame extends JFrame implements ItemListener, TreeSelectionListener{
    JTable table;
    JTree tree = null;
    DefaultMutableTreeNode root;
    Object name[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    JComboBox yearList;
    CalendarBean cale;
    String rili[][];
    String item[] = {"2006","2007","2008","2009","2010"};
    JSplitPane split;
    int year = 2006;
    int month = 0;
    JScrollPane scrollTree,scrollTable;

    public CalenderFrame(){
    cale = new CalendarBean();

    //添加年份列表
    yearList = new JComboBox();
    for(int k = 0 ; k < item.length;k++)
    yearList.addItem(item[k]);
    yearList.addItemListener(this);

    //添加月份树
    root = new DefaultMutableTreeNode(item[0]);
    tree = new JTree(root);
    add(new JScrollPane(tree) , BorderLayout.WEST);
    tree.addTreeSelectionListener(this);

    //设置年月及该月日历
    cale.setYear(year);
    cale.setMonth(month);
    rili = cale.getCalendar();
    table = new JTable(rili,name);

    //添加到窗口
    scrollTree = new JScrollPane(tree);
    scrollTable = new JScrollPane(table);
    split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,scrollTree,scrollTable);
    add(yearList,BorderLayout.NORTH);
    add(split , BorderLayout.CENTER);
    updateYear(year);

    //设置窗口属性
    setSize(580,350);
    setVisible(true);
    split.setDividerLocation(0.5);
    validate();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    //更新年份及月份树
    private void updateYear(int year){
    cale.setYear(year);
    root = new DefaultMutableTreeNode(String.valueOf(year));

    DefaultMutableTreeNode months[] = new DefaultMutableTreeNode[13];
    for(int i = 0 ; i <12;i++){
    months[i] = new DefaultMutableTreeNode("" + (i+1));
    root.add(months[i]);
    }

    split.remove(scrollTree);
    tree = new JTree(root);
    tree.addTreeSelectionListener(this);
    scrollTree = new JScrollPane(tree);
    split.add(scrollTree , JSplitPane.LEFT);
    split.setDividerLocation(0.5);
    validate();
    }

    //年份列表的监听器 
    public void itemStateChanged(ItemEvent e){
    String yearStr = yearList.getSelectedItem().toString().trim();
    int year = Integer.parseInt(yearStr); updateYear(year);
    }

    //树结点的监听器
    public void valueChanged(TreeSelectionEvent e){
    DefaultMutableTreeNode monthNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    if(monthNode.isLeaf()){
    month = Integer.parseInt(monthNode.toString().trim());
    cale.setMonth(month);
    rili = cale.getCalendar();
    split.remove(scrollTable);
    table = new JTable(rili,name);
    scrollTable = new JScrollPane(table);
    split.add(scrollTable, JSplitPane.RIGHT);
    split.setDividerLocation(0.5);
    validate();
    }

    }

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