Вызов класса с 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. А так как вы хорошо знаете свой код, то, опираясь на него, я надеюсь, вы поймёте, чего ему не хватало.

→ Ссылка