1

我正在使用 JTabbedPane 和 JPanel 在一个选项卡上显示 JTable,在另一个选项卡上显示文本、下拉菜单和 jbutton。第一次它工作正常,但如果我最小化或切换屏幕到其他应用程序并返回到我的应用程序,它会正确显示数据,但 JTabbedPane 中的选项卡更改存在严重问题。现在选项卡屏幕变为蓝色并且不显示数据。(我希望数据在那里,但它不是重新绘制或刷新完整的窗口)。现在在蓝屏的情况下,我执行相同的程序并更改 JTabbedPane 中的选项卡,它显示正确的数据。我使用了重绘,但它不起作用。需要帮助才能正确刷新窗口或选项卡。

4

2 回答 2

1

您使用 jdic.dll 可能是浏览器的问题。尝试使用任何其他浏览器重新加载选项卡式窗格。

于 2012-10-27T14:35:41.037 回答
0

我想这个“问题”是常青树。我假设,大多数人可能在错误的事件方法中实现 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);
    }
}

仅此而已,无需其他任何东西 - UI 将自行更新。PS:这个问题与浏览器无关,正如这个线程中“喜欢”的答案所建议的那样,这都是关于 Java Swing GUI 的。

于 2020-02-08T17:40:10.347 回答