我正在尝试掌握Pocket PC的Java ME开发。我正在运行NSIcom CrE-ME模拟器并使用NetBeans 6.5构建我的应用程序。
该应用程序基于三个选项卡面板,每个面板都有Swing组件。 Swing组件的内容在应用程序的各个点进行更新。这些组件包括JTextArea,JTextFields,最重要的是JScrollPane中的JTable。
JTable导致问题。如果我通过马蒂斯用一些样本数据初始化它,它就会出现。但是如果我尝试在运行时在下面的populateFields()方法中设置JTable的引用,则不会出现任何内容。请注意,这只是Sun教程中的示例表数据,甚至不是我的自定义TableModel。
我做错了什么?是否有一些我需要调用的明显更新方法,或者我错过了一些其他明显的错误/ conecpt?我几乎尝试了所有可能的方法,我认为这可能与它有关。
在程序中的不同时间调用populateFields()方法。
public void populateFields()
{
String[] columnNames = {"First Name", "Last Name","Sport", "# of Years", "Vegetarian"};
Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour", "Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne", "Pool", new Integer(10), new Boolean(false)} };
this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));
this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
DefaultTableModel dtm = (DefaultTableModel) this.tableSurvey.getModel();
dtm.fireTableStructureChanged();
dtm.fireTableDataChanged();
this.scrollPaneSurvey.invalidate();
this.scrollPaneSurvey.validate();
this.panelSurvey.validate();
this.panelSurvey.repaint();
}
答案 0 :(得分:1)
好的,我终于发现显然这就是我所需要的:
this.tableSurvey = new JTable(new DefaultTableModel(data, columnNames));
this.scrollPaneSurvey.setViewportView(this.tableSurvey);
this.scrollPaneSurvey.validate();
有谁可以解释为什么使用下面的代码而不是setViewportView()方法不起作用?
this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
谢谢!
答案 1 :(得分:0)
我认为,根据您的代码段,您正在执行
this.scrollPaneSurvey = new JScrollPane(this.tableSurvey);
但问题是父面板布局管理器有自己对旧scrollPaneSurvey的引用。因此,当您重新创建它时,您永远不会替换现有组件,并且此新组件永远不会添加到渲染管道中。你的班级知道它,但是父母没有看到改变的通知。
这有意义吗?
在你发布的第二部分中,你告诉scrollPaneSurvey它应该显示什么,它会生成自动重绘的通知。