Вызов класса с JButton в главный класс
Есть 3 класса Main где вызывается класс WindowApp:
public class Main {
public static void main(String[] args) {
WindowApp windowApp = new WindowApp();
windowApp.window();
windowApp.appMenu();
}
}
Есть класс WindowApp в котором я хочу вызвать метод button() с класса ButtonStart:
import javax.swing.*;
import java.awt.*;
public class WindowApp {
static JFrame jFrame = new JFrame();
ImageIcon icon = new ImageIcon(WindowApp.class.getResource("WindowApp/icon.png"));
String title = "tittle";
JPanel jPanel = new JPanel();
void window() {
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(580, 390);
jFrame.setLocationRelativeTo(null);
jFrame.setResizable(false);
jFrame.setTitle(title);
jFrame.setIconImage(icon.getImage());
jFrame.add(jPanel);
jPanel.setBackground(Color.DARK_GRAY);
}
void appMenu() {
ButtonStart buttonStart = new ButtonStart();
buttonStart.button(); // ЗДЕСЬ Я ПЫТАЮСЬ ВЫЗВАТЬ МЕТОД button(); С КЛАССА StartButton;
}
}
И есть класс ButtonStart в котором я хочу работать с кнопкой:
import javax.swing.*;
import java.awt.*;
public class ButtonStart extends JPanel {
void button() {
JPanel jPanel = new JPanel();
JButton btn = new JButton("");
Image ph = new ImageIcon(this.getClass().getResource("ButtonStart/startgame.png")).getImage();
btn.setBounds(40, 100, 300, 150);
btn.setBackground(Color.darkGray);
btn.setIcon(new ImageIcon(ph));
jPanel.add(btn);
}
}
Вопрос:
Как правильно реализовать класс StartButton, чтобы я мог метод button() вызвать в классе WindowApp,а также чтобы кнопка работала в WindowApp окне?
Ответы (1 шт):
Не уверен, что вам понравится то, что вы увидите, выполнив код, который я вам предложу. В общем и целом над приложением ещё нужно поработать. Но вы, совершенно очевидно, на правильном пути.
Обратите внимание, вы нигде не помещаете панельку, сделанную в методе button() класса ButtonStart в панельку, лежащую в фрейме WindowApp.
Для этого можно, например, получать эту панельку из метода button(). Тогда ваш код будет выглядеть примерно так:
public class Main {
public static void main(String[] args) {
WindowApp windowApp = new WindowApp();
//Сохраним панельку с кнопкой в переменную и передадим её формирователю окна
JPanel bs = windowApp.appMenu();
windowApp.window(bs);
}
}
Формирователь окна теперь должен уметь принимать панельку и помещать её куда-то внутрь себя:
import javax.swing.*;
import java.awt.*;
public class WindowApp {
static JFrame jFrame = new JFrame();
ImageIcon icon = new ImageIcon(WindowApp.class.getResource("WindowApp/icon.png"));
String title = "tittle";
JPanel jPanel = new JPanel();
void window(JPanel bs) {
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(580, 390);
jFrame.setLocationRelativeTo(null);
jFrame.setResizable(false);
jFrame.setTitle(title);
jFrame.setIconImage(icon.getImage());
jFrame.add(jPanel);
jPanel.setBackground(Color.DARK_GRAY);
jPanel.add(bs); //Собственно этого не хватало изначально
}
JPanel appMenu() {
ButtonStart buttonStart = new ButtonStart();
return buttonStart.button(); //Создадим панельку с кнопкой и вернём её в main
}
}
Ну, и собственно, класс, создающий панельку с кнопкой:
import javax.swing.*;
import java.awt.*;
public class ButtonStart extends JPanel {
JPanel button() {
JPanel jPanel = new JPanel();
JButton btn = new JButton("");
Image ph = new ImageIcon(this.getClass().getResource("ButtonStart/startgame.png")).getImage();
btn.setBounds(40, 100, 300, 150);
btn.setBackground(Color.darkGray);
btn.setIcon(new ImageIcon(ph));
jPanel.add(btn);
return jPanel; //Создали и возвращаем
}
}
Мне не очень понравилось визуально то, что я увидел, выполнив код. Но кнопка появилась, а это, видимо, самое главное.
На самом деле, всё это можно сильно оптимизировать и моё решение крайне далеко от идеала (вот прям далеко). Например, очевидно, что метод appMenu() надо вызывать прямо в методе window(). Но вы уже делаете это в main. А так как вы хорошо знаете свой код, то, опираясь на него, я надеюсь, вы поймёте, чего ему не хватало.