如何从另一个线程访问GUI

时间:2013-05-25 18:50:50

标签: java multithreading swing user-interface

我想要完成的是从另一个线程设置文本字段。我的程序有一个按钮,当我点击它一个新线程开始运行并从套接字获取的东西后我想根据数据设置三个文本字段但我不能这样做。我在mainwindow类中编写了一个方法来执行.settext()调用,但是我无法调用该方法,因为我甚至没有引用我的mainwindow实例。如何正确更新我的文本框。

还有一个小问题,我必须让我的组合框最终,因为编译器抱怨这样。

不能引用在不同方法MainWindow.java中定义的内部类中的非final变量comboBox

是什么原因引起的?

public void run()
{
    os.print("INIT {ClassName USARBot."+type.name +"} {Location "+firstPos.x+" , "+firstPos.y+" ,"+firstPos.z+" } {Name "+robotName+"}\r\n");
    while (true)
        try
        {
            String str=is.readLine();
            String[] substr1=null;
            Position p = new Position();
            Scanner s=null;
            if(str.contains("{Type GroundTruth}"))
                substr1=str.split(" ");
                s=new Scanner(substr1[8]);
                p.x=s.nextDouble();
                p.y=s.nextDouble();
                p.z=s.nextDouble();
                s.close();
                //Here I want to set Textfields in MainWindow
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

2 个答案:

答案 0 :(得分:1)

正确回答“独行星云”(无法对你的评论进行投票或在此发表评论)。

通过示例SwingWork example and explanation,您可以在SwingWorker找到一个很好的解释。
上周,当我不得不解决与你相同的事情时,我的想法有点复杂。

答案 1 :(得分:0)

但您评论的下面代码是:

SwingUtilities.invokeLater(new Runnable(){

    public void run(){
        someTextField1.setText("sometext1");
        someTextField2.setText("sometext2");
        someTextField3.setText("sometext3");
    }
});