gpt4 book ai didi

Java 线程和 JTabbedPane 困境

转载 作者:行者123 更新时间:2023-11-30 05:16:02 26 4
gpt4 key购买 nike

在我正在处理的一个项目中,我有一个扩展 JFrame 的主类(名为 TrackWin)。在此框架中,我使用 JTabbedPane。

用户可以从菜单栏在 Pane 中创建新选项卡。每当发生这种情况时,TrackWin 中都会调用 tabbedPane.addTab()。

我还有一个名为 TrackTab 的类,它扩展了 JPanel。此类包含新选项卡的所有实际信息。该类中包含一个线程,每当单击 JButton 时,该线程都会调用“第 3 方”类(和类组)来执行特定操作。

但是,每当我创建多个选项卡并尝试一次启动多个线程实例时,就会出现问题。当我运行调试器(我使用的是 Eclipse)时,我注意到每当单击 JButton 时创建的当前线程集都会被另一个选项卡的线程实例覆盖。

但是,我必须认为我的问题是由于我自己的实现造成的,而不是我正在创建实例的“第三方”类的性质。因为,如果我向 TrackTab 类添加多个 Thread 实例(例如 Thread1 和 Thread2,它们都创建/调用第三方类的新实例),则调试器会为每个实例显示一组线程,并且它们运行良好.

如果有任何建议,我将不胜感激!

这是一些示例代码:

public class TrackWin extends JFrame {
public JTabbedPane tabbedPane;

public TrackWin()
{
tabbedPane = new JTabbedPane();
TrackTab panel = new TrackTab();

tabbedPane.addTab("Tab Name", null, panel,
"Tab Instance");

tabbedPane.updateUI();
add(tabbedPane);

/////////////////////////////////////////////////////////////
// Initialize Menu Bar
/////////////////////////////////////////////////////////////

JMenuBar menuBar = new JMenuBar();
JMenu menu;
JMenuItem menuItem;

menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);

// New Tab Instance
menuItem = new JMenuItem("New Instance");

menuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {

TrackTab panel = new TrackTab();

tabbedPane.addTab("Tab Name", null, panel, "Tab Instance");

tabbedPane.updateUI();
tabbedPane.repaint();
tabbedPane.setVisible(true);
}
});
menu.add(menuItem);
setJMenuBar(menuBar);
setVisible(true);
}
}

TrackTab.java 的线程调用:

thread = new Thread(new TrackThread(variable1, variable2, variable3));
thread.start();

其中,'thread'是TrackTab的公共(public)全局变量。

然后,TrackThread 类很简单:

public class TrackThread extends Thread {
public int variable1;
public int variable2;
public int variable3;

public TrackThread(int variable1, int variable2, int variable3) {
this.variable1 = variable1;
this.variable2 = variable2;
this.variable3 = variable3;
}

public void run() {
3rdPartyClass myPub = new 3rdPartyClass();
myPub.do(variable1, variable2, variable3);
}
}

我没有关于第 3 方类包的大量信息(因为我没有深入研究它),但我确实知道有一些静态变量可能会导致问题。我认识到可能需要进行一些重构。但是,我想知道是否是我的代码首先给我带来了问题。

奇怪的是,在 TrackTab 中,如果我添加另一个 TrackThread 实例并从 TrackTab 的单个实例并行运行它们,一切都会顺利)。太奇怪了。请帮忙!

最佳答案

这可能与您遇到的问题无关,但您的线路:

thread = new Thread(new TrackThread(variable1, variable2, variable3));

看起来“有趣”——TrackThread 本身扩展了 Thread,您不需要在它周围包装另一个线程来运行它。要么让 TrackThread 实现 Runnable (并且不再扩展 Thread),要么只写:

thread = new TrackThread(variable1, variable2, variable3);

这应该同样有效,并且可以节省创建不需要的线程对象的过程。

此外,在调试线程时,为它们命名非常有用,以便更容易区分。使用 setName() 或采用名称参数的构造函数之一。

关于Java 线程和 JTabbedPane 困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255335/

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