Вызов метода с другого класса
Eсть 3 класса.
Main (который вызывает класс WindowApp)
public class Main {
public static void main(String[] args) {
new WindowApp();
}
}
WindowApp (Где структура диалогового окна)
import javax.swing.*;
public class WindowApp extends JFrame {
private String title = "AdventureTime The Game";
static JFrame jFrame = new JFrame();
WindowApp() {
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(550, 380);
setLocationRelativeTo(null);
setResizable(false);
setTitle(title);
}
}
Menu (класс в котором я хочу сделать вкладку Menu для диалогового окна WindowApp)
import javax.swing.*;
public class Menu extends WindowApp {
JMenuBar jMenuBar = new JMenuBar();
JMenu file = new JMenu("File");
void addMenu() {
jMenuBar.add(file);
jFrame.setJMenuBar(jMenuBar);
jFrame.revalidate();
}
}
Вопрос: Как вызвать Menu в WindowApp что бы в этом диалоговом окне была вкладка Menu, или я намутил что-то в Menu классе, просто не могу понять как правильно построить структуру классов, с возможностью вызова методов одного в другого..
Спасибо за помощь!
Ответы (1 шт):
Первоначально бывает тяжело опередить, нужно ли наследование или агрегация. Поэтому общий принцип такой, что лучше начинать с агрегации и переходить к наследованию только при реальной необходимости.
Второй принцип: статические поля использовать только в крайних случаях, применять обычные поля, передавать значения в конструкторы.
Поэтому пример правится по шагам:
- статический
jFrameубирается, вместо него будет использоватьсяthis, передаваемый в конструкторы Menuне наследуется отMainWindow(меню же НЕ является окном)- но в меню нужен доступ до окна (
JFrame), поэтому пусть оно будет полем вMenu - для инициализации поля с
JFrameвMenuнужен конструктор - и добавить вызов
addMenuу созданного объекта.
Итого получается такой набросок из исходного кода:
public class WindowApp extends JFrame {
private String title = "AdventureTime The Game";
private Menu menu = new Menu(this);
WindowApp() {
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(550, 380);
setLocationRelativeTo(null);
setResizable(false);
setTitle(title);
menu.addMenu();
}
}
public class Menu {
JMenuBar jMenuBar = new JMenuBar();
JMenu file = new JMenu("File");
JFrame jFrame;
public Menu(JFrame jFrame) {
this.jFrame = jFrame;
}
void addMenu() {
jMenuBar.add(file);
jFrame.setJMenuBar(jMenuBar);
jFrame.revalidate();
}
}
Это только рабочий набросок. Но для развития подойдёт. Например, revalidate здесь не нужен, меню нужно развить, добавив пункты, setVisible обычно лучше делать после выставления всех параметров окна и т.д. и т.п.