Кнопка на моем экране не переключит меня на мою игровую панель - PullRequest
0 голосов
/ 07 июня 2018

Кнопка на моем экране не отследит меня до моего GamePane класса.Я думаю, что это из-за ActionListener.Я также слышал об использовании MouseListener, но я не знаю, что это такое.

GameFrame:

GameFrame содержит компонент для экрана игры.Этот экран не будет отображаться при нажатии кнопки запуска.

import java.awt.CardLayout;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GamePane extends JPanel {// *change GamePane to GamePane
    // This is were the game screen is made and the player is created.

    private static final long serialVersionUID = 1L;
    JLabel player = new JLabel();
    int playerSpeed = 1;
    int FPS = 30;

    // Set the timer
    // Timer tm = new Timer(1000 / FPS, this);
    // tm.start();

    // The keys set holds the keys being pressed
    private final Set<Integer> keys = new HashSet<>();

    public static void main(String[] args) {
        // Open the GUI window
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // Create a new object and
                // run its go() method
                new GamePane().go();
            }
        });
    }

    GamePane() {
        // Run the parent class constructor
        super();
        // Allow the panel to get focus
        setFocusable(true);
        // Don't let keys change the focus
        setFocusTraversalKeysEnabled(false);
    }

    /**
     * The frame that shows my game
     */
    protected void go() {
        // Setup the window
        JFrame GameFrame = new JFrame();
        // Add this panel to the window
        GameFrame.setLayout(new CardLayout());
        GameFrame.setContentPane(this);

        // Set the window properties
        GameFrame.setTitle("game");
        GameFrame.setSize(800, 400);
        GameFrame.setLocationRelativeTo(null);
        GameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GameFrame.setVisible(true);
        GameFrame.add(new ButtonPane(GameFrame), "game");
    }
}

Панель кнопок:

Это панель, в которой создана кнопка.Кнопка также создается на панели кнопок.

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


public class ButtonPane extends JPanel {
    private static final long serialVersionUID = 1L;
    private JButton startBTN;//Calls the JButton
    JFrame game;

    public ButtonPane(JFrame MainFrame) {
        game = MainFrame;
        setLayout(new GridBagLayout());
        MainFrame.setBackground(Color.BLUE);//Sets the menu stages color blue
        startBTN = new JButton("Start");//Creates a new button
        add(startBTN);//Adds the button on the startStage

        startBTN.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button pressed");
//                ((CardLayout) game.getContentPane().getLayout()).show(game.getContentPane(), "game");
                if (game.getContentPane().getLayout() instanceof CardLayout) {
                    System.out.println("is card layout");
                    CardLayout layout = (CardLayout) getParent().getLayout();
                    layout.show(game.getContentPane(), "game");
                }
            }
        });
    }
}

1 Ответ

0 голосов
/ 07 июня 2018

В вашем коде много чего происходит и слишком много "угадай работы".Вы также объединили свой код, что сделало практически невозможным его обслуживание или управление.

Отойдите назад и пересмотрите свой дизайн.Вам необходимо:

  • Контейнер, который выступает в качестве «основного вида», это контейнер, который используется для переключения между различными представлениями, он выступает в качестве основного «контроллера» для навигации
  • Компонент меню
  • Игровой компонент
  • Рамка для хранения "основного вида"

Давайте начнем с рамки.Рама должна быть максимально тупой.Его единственная задача - получить «главный вид» на экране, совсем немного

Может быть, что-то вроде ...

EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.add(new MainPane());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
});

MainPane (или основной вид) не 'не заботиться о кадре, поэтому нам не нужно ничего передавать ему.Поскольку «главный вид» выступает в качестве нашего контроллера навигации, вы не должны подвергать его другим видам.Этим представлениям не важно, как работает навигация, только то, что они могут перемещаться между представлениями.

Таким образом, вместо передачи MainPane в подпредставления, мы создаем концепцию «контроллера навигации», которая используется дляразрешите подпредставлениям делать запросы о том, что они хотели бы сделать, и затем реализация должна выполнить эту работу.

public interface NavigationController {
    public void showGame();
    public void showMenu();
}

MainPane затем выступает в качестве "основного контейнера" ​​для всех остальных топов.подвиды уровня и NavigationController

public class MainPane extends JPanel implements NavigationController {

    public MainPane() {
        setLayout(new CardLayout());
        add(new MenuPane(this), "menu");
        add(new GamePane(this), "game");
    }

    protected CardLayout getCardLayout() {
        return (CardLayout) getLayout();
    }

    @Override
    public void showGame() {
        getCardLayout().show(this, "game");
    }

    @Override
    public void showMenu() {
        getCardLayout().show(this, "menu");
    }

}

Вся ответственность заключается в том, чтобы облегчить переключение между подпредставлениями верхнего уровня

Тогда наши подпредставления ....

public class MenuPane extends JPanel {

    private NavigationController controller;

    public MenuPane(NavigationController controller) {
        this.controller = controller;
        setLayout(new GridBagLayout());
        JButton btn = new JButton("Do you want to play a game?");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controller.showGame();
            }
        });
        add(btn);
    }

}

public class GamePane extends JPanel {

    private NavigationController controller;

    public GamePane(NavigationController controller) {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        add(new JLabel("Ready player one"), gbc);

        gbc.weighty = 0;
        JButton btn = new JButton("Had enough");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                controller.showMenu();
            }
        });
        add(btn, gbc);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

}

Эти представления выполняют одну работу (что бы это ни было) и делегируют ответственность за навигацию обратно к NavigationController

Если вам интересно, MenuPane будет вашим эквивалентом ButtonPane

Пример выполнения ...

Do you want to play a game?

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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 Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public interface NavigationController {

        public void showGame();

        public void showMenu();
    }

    public class MainPane extends JPanel implements NavigationController {

        public MainPane() {
            setLayout(new CardLayout());
            add(new MenuPane(this), "menu");
            add(new GamePane(this), "game");
        }

        protected CardLayout getCardLayout() {
            return (CardLayout) getLayout();
        }

        @Override
        public void showGame() {
            getCardLayout().show(this, "game");
        }

        @Override
        public void showMenu() {
            getCardLayout().show(this, "menu");
        }

    }

    public class MenuPane extends JPanel {

        private NavigationController controller;

        public MenuPane(NavigationController controller) {
            this.controller = controller;
            setLayout(new GridBagLayout());
            JButton btn = new JButton("Do you want to play a game?");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    controller.showGame();
                }
            });
            add(btn);
        }

    }

    public class GamePane extends JPanel {

        private NavigationController controller;

        public GamePane(NavigationController controller) {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(new JLabel("Ready player one"), gbc);

            gbc.weighty = 0;
            JButton btn = new JButton("Had enough");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    controller.showMenu();
                }
            });
            add(btn, gbc);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...