【问题标题】:Unable to refresh JTabbedPane无法刷新 JTabbedPane
【发布时间】:2012-05-15 19:56:41
【问题描述】:
我使用 JTabbedPane 和 JPanel 在一个选项卡上显示 JTable,在另一个选项卡上显示文本、下拉菜单和 jbutton。
第一次它工作正常,但如果我最小化或切换屏幕到其他应用程序并返回到我的应用程序,它会显示正确的数据,但 JTabbedPane 中的选项卡更改存在严重问题。现在选项卡屏幕变为蓝色并且不显示数据。(我希望数据在那里,但它不是重新绘制或刷新完整的窗口)。
现在在蓝屏的情况下,我执行相同的程序并更改 JTabbedPane 中的选项卡,它显示正确的数据。
我使用了重绘,但它不起作用。
需要帮助才能正确刷新窗口或选项卡。
【问题讨论】:
标签:
swing
jpanel
jtabbedpane
【解决方案1】:
这可能是您使用 jdic.dll 的浏览器的问题。尝试使用任何其他浏览器重新加载您的选项卡式窗格。
【解决方案2】:
我猜这个“问题”是常青树。我认为,大多数人可能在错误的事件方法中实现 JTabbedPane 更改(删除和添加选项卡)时偶然发现了这个问题:
例如,如果您想根据 JComboBox 中的选择删除一个选项卡并在选项卡式窗格中添加一个新选项卡,您必须将您的逻辑放入添加到此组合的 ItemListener 的“itemStateChanged”事件中-盒子。如果你把你的标签更改逻辑例如进入propertyChangeEvent(PropertyChangeListener),你做错了,重新绘制/刷新选项卡式窗格UI元素的时间总是搞砸了!
如果您使用正确的事件方法,您甚至不必调用 setVisible、重新验证或重新绘制。一切都会完美的。
这是一个简单的例子:
JComboBox<String> c_editor = new javax.swing.JComboBox<String>();
c_editor.setModel(new javax.swing.DefaultComboBoxModel<>(
new String[] { "CSV", "EXCEL", "HTML" }
));
c_editor.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
c_editorItemStateChanged(evt);
}
});
...
protected void c_editorItemStateChanged(ItemEvent evt) {
// get the value selected in the combo box
final String val = c_editor.getSelectedItem().toString();
if (tabbed_pane.getTabCount() > 1) {
// remove the panel which is at position 1
tabbed_pane.removeTabAt(1);
}
if (val.equals("CSV")) {
// add the panel for viewing CSV files
tabbed_pane.addTab("CSV Editor", p_csv);
} else if (val.equals("EXCEL")) {
// add the panel for viewing Excel files
tabbed_pane.addTab("Excel Editor", p_excel);
} else if (val.equals("HTML")) {
// add the panel for viewing HTML files
tabbed_pane.addTab("HTML Editor", p_html);
}
}
仅此而已,无需其他任何东西 - 用户界面会自行更新。 PS:这个问题与这个线程中“喜欢”的答案所建议的浏览器无关,都是关于 Java Swing GUI 的。