2

我正在做一个特定的应用程序,只是一个基本的文本编辑器,我记得我有选项卡和 JMenu,所以如果你去 File --> New 它会在 JTabbedPane 上添加或“打开”另一个选项卡。但这一次它不是为我做的,有人可以帮忙吗?这是我的做法:

newFile.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        tabs.addTab("new file", text);
                    }
                }
        );

因此,当单击它时,它应该添加另一个选项卡,但不是出于某种原因...如果重要的话,一开始会打开一个默认选项卡,当您单击新选项卡时,它会清除旧选项卡。谢谢你的帮助!(请询问您是否需要更多解释)在这里我上传了我的代码,因为这里的编辑器一直说我输入的方式格式不正确: http:
//nardcake.com/java
那里有 2 个文件,一个初始化它和另一个是一切谢谢!

4

1 回答 1

2

尝试:

tabs.revalidate();
tabs.repaint();

我已经删除了这两行(无论如何,这两行都是通过 addTab() 方法调用的),并像这样重写了你的 init.java:

 public static void main(String[] args) {
 System.out.println(SwingUtilities.isEventDispatchThread()); // 1
 SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            System.out.println(SwingUtilities.isEventDispatchThread()); //2
            EBLFWE window = new EBLFWE();
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setExtendedState( window.getExtendedState()|JFrame.MAXIMIZED_BOTH );
            window.setSize(1024, 728);
            window.setVisible(true);
        }
    });

现在可以了。引用我自己的话:

Swing 组件的每次使用都必须通过 Event Dispatch Thread(缩写为EDT)来完成,否则您可能会得到不需要的视觉效果。请参阅此处了解说明。

编辑:

所有与 GUI 相关的代码都必须在 EDT 上执行。您可以测试您的代码的某些部分是否EDT 运行,如下所示:

 System.out.println(SwingUtilities.isEventDispatchThread());

如果它打印为 true,那么您可以安全地进行 GUI 更新(例如,在 Swing 组件实例上调用方法)——例如在 1 或 EBLFWE 类中的任何地方。但是 2 会打印错误 - 这是因为 运行的程序的线程不是EDT。

当调用SwingUtilities.invokeLater()时,您实际上是在事件调度线程中放置要执行的代码(在 EDT 认为合适的某个适当时间)。

EDT 执行实际的绘画和许多其他任务,因此当您从另一个线程调用 GUI 更新代码时,您可能会弄乱顺序并获得不需要的视觉外观。

于 2012-10-13T20:54:25.460 回答