gpt4 book ai didi

Java swing 选项卡式 Pane 添加选项卡异常

转载 作者:行者123 更新时间:2023-12-01 12:01:53 24 4
gpt4 key购买 nike

我有一个 Java swing 应用程序,它创建并显示选项卡 Pane 并创建更新线程。触发时的更新线程需要添加一组包含内容的选项卡,但我时不时地遇到异常“线程“AWT-EventQueue-0”java.lang.ArrayIndexOutOfBoundsException 中的异常”。

这与在不同线程中添加选项卡有关吗?如果是这样,我该如何以线程安全的方式向其添加选项卡?

这是一个说明问题的示例应用程序

public class Example extends JFrame implements Runnable {

private final JTabbedPane tabbedPane;
private final Rectangle bounds;

public Example() {
super("Example");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
bounds = new Rectangle(0, 0, 500, 500);
setBounds(bounds);
setLayout(null);

tabbedPane = new JTabbedPane();
tabbedPane.setBounds(bounds);

JPanel jp = new JPanel();
jp.setLayout(null);
jp.setBounds(bounds);
jp.add(tabbedPane);
add(jp);

new Thread(this).start();
}

@Override
public void run() {
while (true) {
for (int i = 0; i < 3; i++) {
tabbedPane.addTab("NEW" + i, new JPanel());
repaint();
}

try {
Thread.sleep(50);
} catch (InterruptedException ex) {
Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

public static void main(String[] args) {
Example e = new Example();
e.setVisible(true);
}
}

最佳答案

Swing 不是线程安全的...

这意味着您永远不应该尝试从事件调度线程的上下文之外创建或修改 UI。

可能的问题是您遇到了某种竞争状况。看看Concurrency in SwingHow to use Swing Timers了解更多详情

import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.Timer;

public class Example extends JFrame {

private final JTabbedPane tabbedPane;
private final Rectangle bounds;

public Example() {
super("Example");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
bounds = new Rectangle(0, 0, 500, 500);
setBounds(bounds);
// setLayout(null);

tabbedPane = new JTabbedPane();
tabbedPane.setBounds(bounds);

// JPanel jp = new JPanel();
// jp.setLayout(null);
// jp.setBounds(bounds);
// jp.add(tabbedPane);
// add(jp);

add(tabbedPane);

Timer timer = new Timer(50, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 3; i++) {
tabbedPane.addTab("NEW" + tabbedPane.getTabCount(), new JPanel());
}
tabbedPane.revalidate();
}
});
timer.start();
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

Example e = new Example();
e.setVisible(true);
}
});
}
}

避免使用 null 布局,像素完美布局是现代 UI 设计中的一种幻觉。影响组件个体尺寸的因素太多,您无法控制其中任何一个。 Swing 的设计初衷是与布局管理器一起工作,放弃它们将导致无穷无尽的问题,您将花费越来越多的时间来尝试纠正

看看Laying Out Components Within a Container了解更多详情

关于Java swing 选项卡式 Pane 添加选项卡异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com