多线程扩展面板

时间:2016-03-29 07:28:45

标签: java multithreading swing runnable

我正在尝试在JPanel中分配实现Runnable接口的JFrame。我做了这个样本来解释我的想法。我想添加一个多线程面板,将一个文本显示为一个窗口,其中String作为新实例的参数。该小组应该有独立的过程,所以我实现了Runnable接口。但是当我尝试使用我的类的新实例创建一个新的实例o面板时,它不起作用。

我做错了什么?

imagePanel面板类:

public class imagePanel extends JPanel implements Runnable{
    JLabel imageTest;

    public imagePanel(String textLabel)
    {
        this.setPreferredSize(new Dimension(300,300));
        imageTest = new JLabel(textLabel);
        imageTest.setPreferredSize(this.getPreferredSize());
    }

    public void setImageText(String newText){
        imageTest.setText(newText);
    }

    public void run(){
        this.add(imageTest);
    }

}

主类测试类:

public class test {
    public static void main(){
        JFrame frame = new JFrame("Test Window");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(300,300));            

        JPanel panel = new imagePanel("Text label");
        panel.setPreferredSize(frame.getPreferredSize());

        frame.add(panel);
        frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:2)

  1. Swing不是线程安全的,这意味着只应在Event Dispatching Thread的上下文中对UI进行更新。有关详细信息,请参阅Concurrency in Swing;有关可能的解决方案,请参见Worker Threads and SwingWorker
  2. Swing布局是懒惰的,这是一件好事,他们不会更新,直到你告诉他们(或其他一些事件要求他们更新,例如,容器调整大小)。您可以通过调用要更新的容器上的revalidaterepaint来触发更新
  3. 创建一个新的类实例并没有神奇地连接你可能拥有的所有实例,这会使程序难以管理

答案 1 :(得分:1)

缺少一些东西

非常重要 - 您不应更新AWT EventDispatcher线程以外的UI。使用Swing甚至可能导致死锁。 this post

您必须使用SwingUtilities更新Swing UI组件。

SwingUtilities.invokeLater(new Runnable(){
    public void run(){
        // update your UI components
    }
});

下一条信息 - 如何创建多线程线程?您错过的是运行“运行”方法的切入点:

public class MyMultiThreadedType implements Runnable {
    public void run() {
        // this will run in parallel
    }

    public static void main(String[] args) {
    MyMultiThreadedType mmt = new MyMultiThreadedType ();
    Thread t = new Thread(mmt);
    t.start(); // this will start a parallel thread
  } 
}