首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

左边是JTree,右边是JTable,用于显示表格(头痛的有关问题,求解.)

2012-08-31 
左边是JTree,右边是JTable,用于显示表格(头痛的问题,求解...)import java.awt.*import javax.swing.*imp

左边是JTree,右边是JTable,用于显示表格(头痛的问题,求解...)
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
public class TestTree extends JFrame implements TreeSelectionListener{
  JPanel panel = new JPanel();
   
  JScrollPane scrollpane1,scrollpane2,scrollpane3; 
  JTable jt1,jt2; 
  JTree jtree;
  JSplitPane js;
  Object colName[]={"学号","姓名","年龄","家庭住址"};
  Object rowData[][]={{"2081714101","张三","20","湖北"},{"2081714102","王五","21","湖南"}};
  Object rowData1[][]={{"2091714101","李四","20","河南"},{"2091714102","王五","21","湖南"}};
 
  DefaultMutableTreeNode root = new DefaultMutableTreeNode("信息工程系"),
  jike = new DefaultMutableTreeNode("计科"),
  guangxin= new DefaultMutableTreeNode("光信"),
  jike1 = new DefaultMutableTreeNode("20817141"),
  jike2 = new DefaultMutableTreeNode("20917141");
   
  public TestTree() {
  setBounds(200,200,800,400);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
  jike.add(jike1);
  jike.add(jike2);
  root.add(jike);
  root.add(guangxin);

  jtree = new JTree(root);
  jtree.addTreeSelectionListener(this);
  jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
  scrollpane1 = new JScrollPane(jtree);
  add(scrollpane1);
   
   
  jt1 =new JTable(rowData,colName);
  scrollpane2 = new JScrollPane(jt1);
  // panel.add(scrollpane2); 
  // add(panel);
   
  jt2 =new JTable(rowData1,colName);
  scrollpane3 = new JScrollPane(jt2);
// panel.add(scrollpane3); 
  // add(panel);
   
   
  js = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,scrollpane1,panel);
  js.setDividerLocation(150);
  js.setOneTouchExpandable(true);
  add(js);
  setVisible(true);
  setContentPane(js);
  }
  public void valueChanged(TreeSelectionEvent e){
  JTree tree = (JTree) e.getSource();
  DefaultMutableTreeNode selectionNode =(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
  if (selectionNode==jike1){
  System.out.println("hello....");
  panel.add(scrollpane2); 
  add(panel);
  }  
  else if (selectionNode==jike2){
System.out.println("hello world....");
panel.add(scrollpane3); 
  add(panel);
  }


  }

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

出现异常,而且显示的有问题,中间的分割线跑到最右边....高手指教啊

hello....
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: cannot add to layout: unknown constraint: null
  at javax.swing.plaf.basic.BasicSplitPaneUI$BasicHorizontalLayoutManager.addLayoutComponent(BasicSplitPaneUI.java:1417)
  at javax.swing.plaf.basic.BasicSplitPaneUI$BasicHorizontalLayoutManager.addLayoutComponent(BasicSplitPaneUI.java:1518)


  at java.awt.Container.addImpl(Container.java:1074)
  at javax.swing.JSplitPane.addImpl(JSplitPane.java:1015)
  at java.awt.Container.add(Container.java:959)
  at javax.swing.JFrame.addImpl(JFrame.java:540)
  at java.awt.Container.add(Container.java:365)
  at TestTree.valueChanged(TestTree.java:62)
  at javax.swing.JTree.fireValueChanged(JTree.java:2820)
  at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3191)
  at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
  at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
  at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287)
  at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:170)
  at javax.swing.JTree.setSelectionPath(JTree.java:1598)
  at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2311)
  at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3520)
  at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3459)
  at java.awt.Component.processMouseEvent(Component.java:6260)
  at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
  at java.awt.Component.processEvent(Component.java:6028)
  at java.awt.Container.processEvent(Container.java:2041)
  at java.awt.Component.dispatchEventImpl(Component.java:4630)
  at java.awt.Container.dispatchEventImpl(Container.java:2099)
  at java.awt.Component.dispatchEvent(Component.java:4460)
  at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
  at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)
  at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
  at java.awt.Container.dispatchEventImpl(Container.java:2085)
  at java.awt.Window.dispatchEventImpl(Window.java:2478)
  at java.awt.Component.dispatchEvent(Component.java:4460)
  at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
  at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
  at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
  at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
hello world....
hello....


[解决办法]
改了下,更新组件不能一直add
要用updateUI();

Java code
import java.awt.*; 
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
public class TestTree extends JFrame implements TreeSelectionListener{
JPanel panel = new JPanel();
 
JScrollPane scrollpane1,scrollpane2,scrollpane3; 
JTable jt1,jt2; 
JTree jtree;
JSplitPane js;
Object colName[]={"学号","姓名","年龄","家庭住址"};
Object rowData[][]={{"2081714101","张三","20","湖北"},{"2081714102","王五","21","湖南"}};
Object rowData1[][]={{"2091714101","李四","20","河南"},{"2091714102","王五","21","湖南"}};

DefaultMutableTreeNode root = new DefaultMutableTreeNode("信息工程系"),


jike = new DefaultMutableTreeNode("计科"),
guangxin= new DefaultMutableTreeNode("光信"),
jike1 = new DefaultMutableTreeNode("20817141"),
jike2 = new DefaultMutableTreeNode("20917141");
 
public TestTree() {
setBounds(200,200,800,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jike.add(jike1);
jike.add(jike2);
root.add(jike);
root.add(guangxin);

jtree = new JTree(root);
jtree.addTreeSelectionListener(this);
jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
scrollpane1 = new JScrollPane(jtree);
add(scrollpane1);
 
 
jt1 =new JTable(rowData,colName);
scrollpane2 = new JScrollPane(jt1);
// panel.add(scrollpane2); 
// add(panel);
 
jt2 =new JTable(rowData1,colName);
scrollpane3 = new JScrollPane(jt2);
// panel.add(scrollpane3); 
// add(panel);
 
 
js = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,scrollpane1,panel);
js.setDividerLocation(150);
js.setOneTouchExpandable(true);
add(js);
setVisible(true);
setContentPane(js);
}

public void valueChanged(TreeSelectionEvent e){
JTree tree = (JTree) e.getSource();
DefaultMutableTreeNode selectionNode =(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
if (selectionNode==jike1){
  System.out.println("hello....");
  panel.removeAll();
  panel.add(scrollpane2); 
  panel.updateUI();

else if (selectionNode==jike2){
  System.out.println("hello world....");
  panel.removeAll();
  panel.add(scrollpane3);
  panel.updateUI();
}
}

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


[解决办法]
panel.removeAll();
这句不是必要的,
但是为了减少程序的资源消耗,这是一个好的习惯
(在想更新成新的组件之前,先移除老的组件)

panel.updateUI();
这个就是在组件更新之后,让组件按照当前的状态进行重绘
(如果没有这个,那即使你更新了组件(add,remove),组件的界面还是不会更新)

楼主可以看看java的API,这样对提高很有帮助
[解决办法]
探讨
add(panel);
请问为什么不用这句呢?panel没有添加到窗体。。。。

热点排行