MVP, JFrame, JDialog: графический интерфейс зависает

#java #swing #user-interface

#java #swing #пользовательский интерфейс

Вопрос:

У меня есть основной фрейм (с полем JFrame) в качестве представления, затем presenter (созданный в конструкторе view), который добавляет слушателей к кнопкам и прочему. Я делаю это следующим образом:

 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 вызывает в своем конструкторе только один метод — intialize — который создает только поля графического интерфейса. Наконец (буквально последняя строка его кода) создается presenter.

Ведущий должен показывать новый JDialog при определенных событиях в главном окне. У него есть один метод, который заставляет мой графический интерфейс зависать. Это выглядит так:

 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;
    }

}
  

Теперь кто-нибудь знает, какую ошибку я допустил и почему зависает мой графический интерфейс?
Спасибо!

Комментарии:

1. Что вы подразумеваете под зависаниями графического интерфейса?

2. То, что вы не можете взаимодействовать с компонентами пользовательского интерфейса, зависает …

3. Происходит ли это только тогда, когда JDialog виден?

Ответ №1:

Если графический интерфейс зависает, это обычно потому, что вы блокируете EDT. Прочитайте раздел из руководства Swing по параллелизму для получения дополнительной информации.

Мы не можем сказать, что вы делаете, потому что ваш код не завершен. Например, вы даже не добавляете никаких компонентов в графический интерфейс. Итак, кто знает, что вы делаете в коде, который вы пропустили.

Для получения дополнительной помощи опубликуйте свой SSCCE, который демонстрирует проблему.

Комментарии:

1. Я попытался написать SSCCE и обнаружил, что это была другая проблема (мне не удалось доказать ошибку). Спасибо, что указали мне правильный путь.