具有多个swing UI的EventQueue.invokeLater

时间:2016-03-11 14:27:17

标签: java swing invokelater

对EventQueue.invokeLater()here.进行了很好的讨论

我有一个控制器类Master(),可以在我的应用程序中加载两个UI窗口。例如:

public class Master(){

     public Master(){
        aView = new subView();
        bView = new subView();

subView扩展JFrame并具有以下主要方法:

public class SubView extends JFrame{
    ....

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new SubView();
            }
        });}
}

请注意SubView.main()使用invokeLater()。我的问题是如何在master 中调用Later()?类似的东西:

public class Master(){

     public Master(){
        aView = EventQueue.invokeLater(new subView);
        bView = EventQueue.invokeLater(new subView);

这不是这么简单,因为invokeLater不会返回任何内容。此外,因为它“稍后调用”,aView和bView的值在Master中保持为null。无论如何以main()在runLater线程中调用其中一个的相同方式调用它们?

3 个答案:

答案 0 :(得分:1)

我会使用invokeAndWait,因为你需要等待结果。

SubView aView, bView;

public Master() {
    java.awt.EventQueue.invokeAndWait(new Runnable() {
        public void run() {
            aView = new SubView();
            bView = new SubView();
        }
    });
    // aView and bView will be initialised.
}

答案 1 :(得分:1)

通过调用Runnable的实例来解决这个问题可能会很麻烦。作为替代方法,使用SwingWorker来更新主视图和详细视图的表模型。这个example可能是一个有用的注意点。

答案 2 :(得分:0)

根据彼得的建议,我做了以下事情:

我创建了一个名为<option ng-repeat="type in Types" value="{{type.Name}}">{{type.Name}}</option> 的中间Runnable,它返回公开对象RunUIThreadaView,因此我可以将它们返回给我的Master程序。彼得,你认为这是有效的吗?

bView