Java线程和JTabbedPane困境

时间:2009-08-10 14:46:44

标签: java multithreading instance jtabbedpane

在我正在开发的项目中,我有一个扩展JFrame的主类(名为TrackWin)。在这个框架中,我使用了JTabbedPane。

用户可以从菜单栏在窗格中创建新选项卡。只要发生这种情况,就会在TrackWin中调用tabbedPane.addTab()。

我还有一个名为TrackTab的类,它扩展了JPanel。此类包含新选项卡的所有实际信息。包含在这个类中的是一个Thread,它调用“第三方”类(和一组类),以便在单击JButton时执行特定操作。

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

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

我很感激任何建议!

以下是一些示例代码:

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);
    }
}

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

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

2 个答案:

答案 0 :(得分:2)

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

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

看起来'有趣' - TrackThread本身扩展了Thread,你不需要在它周围包裹另一个线程来运行它。要么让TrackThread实现Runnable(而不再扩展Thread),要么只写:

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

这应该也可以正常工作并保存不需要的线程对象的创建。

此外,在调试线程时,命名它们非常有用,因此它们更容易区分。使用setName()或其中一个带有name参数的构造函数。

答案 1 :(得分:0)

除了西蒙的观察和推荐,我建议你尽量减少你的未知数。

在这种情况下,这意味着嘲笑你的第三方课程。用你知道的东西替换它,不要有任何有问题的静力学。没什么好看的,只是一个简单的线程运行并在某处产生输出。