我正在做一个特定的应用程序,只是一个基本的文本编辑器,我记得我有选项卡和 JMenu,所以如果您转到文件 --> 新建,它将在 JTabbedPane 上添加或“打开”另一个选项卡。但这一次它不适合我,有人可以帮忙吗?我是这样做的:
newFile.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
tabs.addTab("new file", text);
}
}
);
因此,当单击它时,它应该添加另一个选项卡,但这不是出于某种原因......
如果重要的话,一开始会打开一个默认选项卡,当您单击“新建”时,它会清除旧选项卡。
谢谢你的帮助! (请询问是否需要更多解释)
我在这里上传了我的代码,因为这里的编辑一直说我放置它的方式格式不正确:
http://nardcake.com/java
那里有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);
}
});
现在可以了。至quote我自己:
Every usage of Swing components must be done thorugh the Event Dispatch Thread (abbreviated EDT) or you will probably get unwanted visual effects. See here for explanation.
编辑:
所有与 GUI 相关的代码都必须在 EDT 上执行。您可以测试代码的某些部分是否由 EDT 运行,如下所示:
System.out.println(SwingUtilities.isEventDispatchThread());
如果它打印 true,那么您可以安全地进行 GUI 更新(例如,调用 Swing 组件实例上的方法) - 就像 1 中或 EBLFWE 类中的任何位置一样。然而 2 将打印 false - 这是因为 thread 运行您的程序不是 EDT。
调用SwingUtilities.invokeLater()时您实际上是将要执行的代码(在 EDT 认为合适的某个适当时间)放置在事件调度线程中。
EDT 执行实际的绘制以及许多其他任务,因此当您从另一个 thread 调用 GUI 更新代码时您可能会打乱顺序并获得不需要的视觉外观。
关于Java JTabbedPane无法添加多个选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12876889/