#java #containers #jframe #jpanel #switch-statement
#java #контейнеры #jframe #jpanel #switch-инструкция
Вопрос:
У меня есть jFrame
класс MainForm
, который содержит main()
, placePanel(panel)
и выпадающее меню. Из пунктов выпадающего меню я вызываю placePanel(panel)
метод on, чтобы поместить определенную панель в jFrame
контейнер. Это работает нормально.
Но я не знаю, как переключать панели, когда я нажимаю на кнопку, которая находится внутри jPanel
класса. Когда я пытаюсь вызвать jFrame
‘ы MainForm.placePanel(panel)
из любого jPanel
, который загружен в jFrame
контейнер, я получаю сообщение об ошибке: cannot reference non-static content
и т.д. Я тоже пробовал Mainform.getContainer().add(panel)
, но это тоже не работает.
Я не могу понять, как получить доступ к MainForm
контейнеру из другого класса или как переключать панели с помощью метода из другой панели.
Спасибо
Ответ №1:
Если вы хотите вызвать метод для объекта из другого объекта, вам понадобится ссылка на первый объект, чтобы вы могли вызвать метод для самого активного объекта, а не для класса (как вы сейчас пытаетесь сделать). Один из способов решить эту проблему — передать ссылку на класс, который содержит JPanels, классу, у которого есть код прослушивателя действия кнопки, возможно, в конструкторе последнего. Другими словами, вы захотите передать ссылку на текущий активный и визуализированный объект MainForm в класс, который имеет ActionListener для кнопки.
Кстати, вы меняете JPanels на CardLayout? Если нет, я предлагаю вам изучить это, поскольку обычно это самый простой способ сделать это.
Редактировать:
Например, допустим, у вас есть класс с именем MainForm, который имеет открытый метод с именем swapJPanels, который позволяет ему менять местами представления, и другой класс MyPanel, в котором есть ваш JButton, который хочет вызвать метод из класса MainForm, тогда вы могли бы предоставить MyPanel конструктор, который принимает параметр MainForm и позволяет передавать ссылку из текущего объекта MainForm (это внутри класса) в объект MyPanel:
Основная форма:
class MainForm extends JFrame {
public MainForm() {
MyPanel myPanel = new MyPanel(this); // pass "this" or the current MainForm reference to MyPanel
}
public void swapJPanels(int panelNumber) {
}
}
MyPanel:
class MyPanel extends JPanel {
private MainForm myMainForm; // holds the reference to the current MainForm object
public MyPanel(MainForm myMainForm) {
this.myMainForm = myMainForm; // set the reference
JButton swapPanelBtn = new JButton("Swap Panel");
swapPanelBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
swapPanelBtnActionPerformed();
}
});
}
private void swapPanelBtnActionPerformed() {
myMainForm.swapJPanels(0); // calling a method on the reference to the current MainForm object
}
}
Комментарии:
1. Я не использую CardLayout, я ничего не знаю о, и это первый раз, когда я услышал об этом. Я собираюсь посмотреть это и посмотреть, что это делает. Кроме того, что вы подразумеваете под «передачей ссылки»? Я уже пытался ссылаться на основную форму JFrame из JPanel, используя: MainForm.getContainer().add (панель)? Я знаю, что это неправильно, но как мне правильно «передать ссылку»?
2. @Luka: вы можете найти руководство по его использованию здесь: Как использовать CardLayout , но поймите, что это не решит вашу первоначальную проблему — наличие и вызов методов для ссылки на один объект внутри другого объекта.
3. Хорошо, макет карты интересен, но это обходной путь. Но что я делаю не так с MainForm.getContainer().add (панель) или MainForm.placePanel (панель)? Всякий раз, когда я пытаюсь использовать этот код (который работает внутри Jframe) из JPanel, он выдает ошибку. У меня уже есть метод placePanel, как мне вызвать его из другого класса?
4. @Luka: Снова вы пытаетесь вызвать метод в классе MainForm, и это просто не сработает. Вам нужно вызвать метод для объекта MainForm . Если вы не понимаете разницы, вам, вероятно, следует отказаться от программирования в графическом интерфейсе, пока вы не овладеете основами. Эти руководства могут вам помочь: Java Tutorials
5. Ваш последний пост теперь мне как-то понятнее, спасибо 🙂 Как я понимаю, object является экземпляром класса. Если я хочу вызвать объект MainForm, что мне нужно сделать: создать MainForm? Я думаю, что я это сделал, но это привело к появлению новой основной формы, поэтому у меня их было 2…