在我正在进行的一个项目中,我有一个扩展 JFrame 的主类(名为 TrackWin)。在这个框架中,我使用了 JTabbedPane。
用户可以从菜单栏在窗格中创建一个新选项卡。每当发生这种情况时,就会在 TrackWin 中调用 tabbedPane.addTab()。
我还有一个名为 TrackTab 的类,它扩展了 JPanel。此类包含新选项卡的所有实际信息。此类中包含一个 Thread,它调用“第 3 方”类(和类组)以在单击 JButton 时执行特定操作。
但是,每当我创建多个选项卡并尝试一次启动多个线程实例时,就会出现我的问题。当我运行调试器(我正在使用 Eclipse)时,我注意到每当单击 JButton 时创建的当前线程集被另一个选项卡的线程实例覆盖。
但是,我不得不认为我的问题是由于我自己的实现,而不是我正在制作实例的“第 3 方”类的性质。因为,如果我向 TrackTab 类添加多个线程实例(例如,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的公共全局变量。
然后,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);
}
}
我没有关于 3rd 方类包的大量信息(因为我没有深入研究它),但我知道有一些静态变量可能会导致问题。我认识到可能需要进行一些重构。但是,我想知道是否是我的代码首先给我带来了问题。
奇怪的是,在 TrackTab 中,如果我添加另一个 TrackThread 实例并从 TrackTab 的单个实例同时运行它们,一切顺利)。太奇怪了。请帮忙!