MVP, JFrame, JDialog: GUI正在冻结



我有主框架(与JFrame字段)asi 视图,然后演示器(在视图的构造函数中创建),添加监听器按钮和东西。我这样做:

public static void main(final String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    MyWindow window = new MyWindow();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

MyWindow在它的构造函数中只调用一个方法——initialize——它只创建GUI字段。最后(实际上是代码的最后一行),它创建了presenter。

Presenter应该在主视图中显示新的JDialog。它有一个方法,,使我的GUI冻结。它看起来像这样:

protected double[] getParams(final Class<?> indicatorClass) {
        ParametrizableDialog dialog = dialogs.get(indicatorClass); // works well
        List<Double> params = new ArrayList<Double>();
        dialog.setParams(params);
        dialog.setModal(true);
        dialog.setLocationRelativeTo(view.getFrame());
        dialog.setVisible(true);
        System.out.println(params); // it actually works, params are obtained from JDialog as user input
        return Doubles.toArray(params); // guava
    }

ParametrizableDialog是正常的JDialog,它实现一个方法接口,设置List<Double>参数,如下所示:

public class ParametrizableDialog extends JDialog implements Parametrizable {
    protected List<Double> params;
    @Override
    public void setParams(final List<Double> params) {
        this.params = params;
    }
}
现在,有谁知道我犯了什么错误,为什么我的GUI冻结?谢谢!

如果GUI冻结,通常是因为您阻塞了EDT。有关更多信息,请阅读Swing教程中的并发部分。

我们不知道你在做什么,因为你的代码不完整。例如,您甚至不需要向GUI添加任何组件。所以谁知道你在你遗漏的代码中做了什么。

要获得更多帮助,请发布演示问题的SSCCE

最新更新