Структура программирования качания Java: должны ли слушатели быть источником почти всех качающихся компонентов?

StackOverflow https://stackoverflow.com/questions/3521143

Вопрос

Мой вопрос сводится к этому: это стандартная структура в программировании качания, чтобы дать слушателям контролировать новые компоненты (например, новую jpanel) для отображения и ввода, а также для того, чтобы предотвратить управление слушателями нового компонента по новым компонентам для отображения и ввода, и поэтому на бесконечность? Или Java нужно вернуть обратно в какой-то объединяющий класс, который связывает все качающиеся компоненты вместе в процедурном порядке?

В настоящее время в моем приложении, которые используют только один JFRAME, в моих слушателях, мой начальный объект JFrame передается как параметр для всех моих JPanels, чтобы их слушатели могли позвонить в RemovealL (), чтобы очистить кадр для новой JPANEL. Например, короткий код следующим образом

public class MainFrame {
  JFrame jfrm;
  public MainFrame() {
    jfrm = new JFrame("Main Frame");
    JPanel mainPanel = new MainPanel(jfrm);
  }
}

public class MainPanel extends JPanel {
  public MainPanel(final JFrame mainFrame) {
    JButton example = new JButton("Example");
    example.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent le) {
            mainFrame.removeall();
            JPanel 2ndPanel = new 2ndPanel(mainFrame);
            mainFrame.add(2ndPanel);
            mainFrame.validate();
        }
    });
  }
}

Это правильная структура - где это слушатели, которые генерируют новые панели, а не в одном объединении? Но если это так, то, как компилятор Java выступает в MainFrame.Validate (), если есть каскадная бесконечность слушателей? Я процепционный программист старого школы, пытающийся запрограммировать приложение Swing в Java, и я считаю, что я не мог схватить основные концепции программирования качания. С нетерпением ждем любых полезных ответов, и заранее спасибо!

Это было полезно?

Решение

Я бы не сделал это так. То Узор наблюдателя используется в качании для отправки уведомлений, как правило, в результате действий пользователя.

Возьмите свой пример: пользователь нажимает на кнопку, потому что он хочет новую панель в MainFrame. Но кнопка не знает, что делать с кликом. Все, что он может сделать, это уведомить Слушатели событий, что он был выбран.

Поэтому нам нужен какой-то компонент, который заинтересован в уведомлениях. Этот компонент может зарегистрировать слушатель с кнопкой и получать уведомления. Слушатель - это ухо это другие компоненты (или это «глаз»). Но ухо (или глаз) не примет меры. Это только датчик других компонентов.

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

Но Стейтнер - это плохое место для этого кода.

Другие советы

Вместо разрушения и создания панелей вы можете посмотреть на скрытие / показывать их. Есть менеджер макета Cardlayout, который может сделать это: http://journals.ecs.soton.ac.uk/java/tutorial/ui/layout/card.html.

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

Как сказано, что другие, вы можете добавить какую-то модель к вашему дизайну, которая отвечает за поддержание состояния системы.

Прежде всего, вы не должны позволять слушателю манипулировать кадром напрямую, используйте вложенное JPanel или это ContentPane.

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

Я не думаю, что есть бесконечность слушателей. Они в списке и выполнены последовательно. Ваш слушатель должен использовать SwingUtilities.invokeLater для манипулирования основной рамкой.

Я нахожу прохождение JFrame как аргумент немного избыточно. Почему бы не создать слушателя снаружи конструктора?

 final JPanel mainPanel = new MainPanel();     
 JButton example = new JButton("Example");
 example.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent le) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               MainFrame.this.removeAll();
               MainFrame.this.add(mainPanel);
            }
         });;
    }
 });
 add(example);

Это не самые лучшие примеры, но я отмечаю, что вы пытаетесь сделать.

Сутью является вы должны создать компоненты за пределами Слушатель, а затем добавьте его с помощью слушателя.

Существует некоторая путаница, не необычная, как вы организовали свой код. Как общее правило Java, не подкласс, где у вас нет причин. Редко имеет смысл подклассу JPanel или JFrame.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top