Структура программирования качания Java: должны ли слушатели быть источником почти всех качающихся компонентов?
Вопрос
Мой вопрос сводится к этому: это стандартная структура в программировании качания, чтобы дать слушателям контролировать новые компоненты (например, новую 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
.
Это также редко имеет смысл назначать компоненты полям в классе, который их создает. На самом деле делать меньше в конструкторах.
Также делать меньше в анонимных внутренних классах. Задолжать данные о событиях и вызовите метод, который имеет смысл для приколного класса иметь в качестве операции.