Не могу добавить JLabels при нажатии кнопки с gridbaglayout - PullRequest
0 голосов
/ 22 марта 2020

Я относительно новый программист, и я пытаюсь проверить свои знания о JFrame и Java GUI, создав очень основную c игру. В настоящее время я работаю над главным меню. Я использую GridBagLayout для размещения всех компонентов на экране. Когда пользователь нажимает кнопку инструкции, он должен очистить панель и добавить новую JLabel. Я успешно написал метод, который очищает панель, но я не могу добавить новый JLabel. Вот текущий код, который у меня есть:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

    JPanel panel = new JPanel();
    JFrame frame = new JFrame();
    GridBagConstraints c = new GridBagConstraints();

    int WIDTH = 500;
    int HEIGHT = 500;

    public static void main(String[] args) {
        Main game = new Main();
        game.window();
    }

    public void window() {

        // window builder
        frame.setSize(WIDTH, HEIGHT);
        frame.setVisible(true);
        frame.setAlwaysOnTop(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setTitle("Spaceship War");
        frame.setLocationRelativeTo(null);

        //GUI layout

        panel.setLayout(new GridBagLayout());

        JButton playButton = new JButton("Play!");
        playButton.addActionListener(new playListener());
        c.ipadx = 50;
        c.ipady = 50;
        c.gridx = 0;
        c.gridy = 0;
        panel.add(playButton, c);

        JButton instructionsButton = new JButton("Instructions");
        instructionsButton.addActionListener(new instructionsListener());
        c.insets = new Insets(10,0,0,0);
        c.gridx = 0;
        c.anchor = GridBagConstraints.PAGE_END;
        c.gridy = 1;
        panel.add(instructionsButton, c);

        JButton quitButton = new JButton("Quit");
        quitButton.addActionListener(new quitListener());
        c.insets = new Insets(10,0,0,0);
        c.gridx = 0;
        c.gridy = 2;
        panel.add(quitButton, c);

        frame.add(panel);
    }

    public void clearPanel() {
        panel.removeAll();
        panel.repaint();
    }

    public void instructionsScreen() {
        clearPanel();
        JPanel instructionsPanel = new JPanel();
        JLabel instructionsLabel = new JLabel("test");
        instructionsPanel.add(instructionsLabel);
        frame.add(instructionsPanel);
    }

    // event listener classes

    class playListener implements ActionListener {

        public void actionPerformed(ActionEvent event) {
            System.out.println("Play button pressed!");
            clearPanel();
        }

    }

    class instructionsListener implements ActionListener {

        public void actionPerformed(ActionEvent event) {
            System.out.println("Instructions button pressed!");
            clearPanel();
            instructionsScreen();
        }

    }

    class quitListener implements ActionListener {

        public void actionPerformed(ActionEvent event) {
            System.out.println("Quit button pressed!");
            System.out.println("Exiting...");
            System.exit(0);

        }

    }

}

Приношу свои извинения, если я совершаю простую ошибку в глазах более опытного программиста Java. Спасибо!

1 Ответ

0 голосов
/ 22 марта 2020

Вам нужно проверить ();

public void clearPanel() {
         panel.removeAll();
         panel.validate();
         panel.repaint();
    }
...