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

海风bruce 2010-11-30 05:23:10
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....
...全文
162 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyiz 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tian_song 的回复:]
add(panel);
请问为什么不用这句呢?panel没有添加到窗体。。。。
[/Quote]
js = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,scrollpane1,panel);
你生成这个JSplitPane的时候,panel就已经添加上去了
海风bruce 2010-11-30
  • 打赏
  • 举报
回复
add(panel);
请问为什么不用这句呢?panel没有添加到窗体。。。。
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
panel.removeAll();
这句不是必要的,
但是为了减少程序的资源消耗,这是一个好的习惯
(在想更新成新的组件之前,先移除老的组件)

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

楼主可以看看java的API,这样对提高很有帮助
海风bruce 2010-11-30
  • 打赏
  • 举报
回复
我也刚刚学的,老师没多讲, panel.removeAll(); panel.add(scrollpane2);
panel.updateUI();特别是这两个地方 根本不知道,没学过...指点一下
海风bruce 2010-11-30
  • 打赏
  • 举报
回复
楼上的 我试了 果然如此 不知为什么 有没有好的文章
sunyiz 2010-11-30
  • 打赏
  • 举报
回复
改了下,更新组件不能一直add
要用updateUI();

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();
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧