【问题标题】:EventQueue.invokeLater with multiple swing UIsEventQueue.invokeLater 与多个摇摆 UI
【发布时间】:2016-03-11 14:27:17
【问题描述】:

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 中保持为空。有没有办法以 main() 在 runLater 线程中调用其中一个的相同方式调用两者?

【问题讨论】:

  • 你真的需要吗?如果 Master 总是在 EDT 上实例化,则无需使用 invokeLater
  • (还有:aView = subView(); 应该是 aView = new SubView(); 吗?)
  • (最后:aView = EventQueue.invokeLater(new subView); 是基本构造的错误语法。可能意味着aView = EventQueue.invokeLater(new SubView());?)
  • 你说得对,这就是为什么我指定它是元代码;我知道我犯了错误。将尝试清理它,谢谢。

标签: java swing invokelater


【解决方案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.
}

【讨论】:

  • 谢谢。这很有意义:)让我尝试一下,然后我会回来接受答案。就我的理解而言,这意味着 aView 和 bView 运行在与主线程共享但独立的线程中,对吧?
  • 啊,所以我遇到的一个问题是 Master() 无法访问 aView 和 bView。我需要将它们存储为字段。让我玩它并报告。
  • @AdamHughes 您要么需要将它们存储为字段,要么将它们存储在集合中,或者在开始任务之前将它们存储在初始化的数组中。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    按照彼得的建议,我做了以下事情:

    我创建了一个名为RunUIThread 的中间Runnable,它返回公开对象aViewbView,因此我可以将它们返回到我的主程序。彼得,你认为这是有效的吗?

        RunUIThread uiThread = new RunUIThread();
        try {
            java.awt.EventQueue.invokeAndWait(uiThread);
        } catch (InterruptedException | InvocationTargetException ex) {
            LOG.error("MasterView interrupted or failed to invoke RunUIThread");
        }
        aView = uiThread.getaView();
        bView = uiThread.getbView();    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多