Получаете ошибку при создании ArrayList из JButtons? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь написать игру в тетрис самостоятельно. Я создал класс, который обрабатывает элементы управления, в котором происходит следующее:

  1. Спрашивает, согласен ли игрок с элементами управления по умолчанию, и выводит их список
  2. Если они нажимают нет, тогда другое JFrame выскакивает, спрашивая, какую кнопку они хотят изменить. Здесь я создаю ArrayList кнопок J, поэтому мне не нужно создавать каждый из них по отдельности, когда все они делают одно и то же.
  3. Когда кто-то нажимает на один из элементов управления, он появляется с другим JFrame, запрашивающим ключ, которым они хотят заменить этот элемент управления.

Теперь вот проблема. Когда я запускаю свой код, после нажатия кнопки нет (что я хочу изменить элемент управления), консоль выдает исключение нулевого указателя. Я смущен этим, я что-то упускаю? Я новичок в использовании JFrame, вот мой метод, который обрабатывает все это:

public void changeControls() {
        JFrame controls = new JFrame();
        JPanel panelControls = new JPanel();
        JLabel controlLabel = new JLabel("Change which control?");

        controls.add(panel, BorderLayout.CENTER);
        controls.setPreferredSize(new Dimension(600, 600));
        controls.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        controls.setTitle("Change Controls");
        controls.setVisible(true);
        controls.pack();
        panelControls.setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
        panelControls.setSize(600, 600);
        panelControls.setLayout(new GridLayout(0, 1));
        panelControls.add(controlLabel);

        String[] names = {"Move Piece Right", "Move Piece Left", "Soft Drop", "Hard Drop", "Rotate Right", "Rotate Left"};
        ArrayList<JButton> buttons = new ArrayList<JButton>();
        for (int i = 0; i < 6; i++) {
            buttons.add(new JButton(names[i]));
            final Integer counter = Integer.valueOf(i);
            final String type = names[i];
            buttons.get(i).addMouseListener(new MouseListener() {

                @Override
                public void mouseClicked(MouseEvent e) {
                    JFrame editControl = new JFrame();
                    JPanel editControlPanel = new JPanel();
                    JLabel editLabel = new JLabel("Change controls for " + names[counter]);
                    JButton okay = new JButton("Click to Change to above text.");
                    JTextField text = new JTextField();
                    text.setColumns(1);
                    editControl.add(panel, BorderLayout.CENTER);
                    editControl.setPreferredSize(new Dimension(600, 600));
                    editControl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    editControl.setTitle("Change Controls");
                    editControl.pack();
                    editControlPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
                    editControlPanel.setSize(600, 600);
                    editControlPanel.setLayout(new GridLayout(0, 1));
                    editControlPanel.add(editLabel);
                    editControlPanel.add(text);
                    okay.addMouseListener(new MouseListener() {

                        @Override
                        public void mouseClicked(MouseEvent e) {
                            editControl.dispose();

                        }

                        @Override
                        public void mousePressed(MouseEvent e) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void mouseReleased(MouseEvent e) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void mouseEntered(MouseEvent e) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void mouseExited(MouseEvent e) {
                            // TODO Auto-generated method stub

                        }

                    });
                    editControlPanel.add(okay);

                    KeyStroke ks = KeyStroke.getKeyStroke(text.getText());
                    switch(type) {
                    case "Move Piece Right":
                        moveRight = ks.getKeyCode();
                    case "Move Piece Left":
                        moveLeft = ks.getKeyCode();
                    case "Soft Drop":
                        softDrop = ks.getKeyCode();
                    case "Hard Drop":
                        hardDrop = ks.getKeyCode();
                    case "Rotate Right":
                        rotateRight = ks.getKeyCode();
                    case "Rotate Left":
                        rotateLeft = ks.getKeyCode();
                    }


                }

                @Override
                public void mousePressed(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void mouseExited(MouseEvent e) {
                    // TODO Auto-generated method stub

                }

            });
            panelControls.add(buttons.get(i));
        }
        controls.dispose();
        startGame();


    }

Спасибо за всю помощь заранее. Также ошибка в этой строке:

controls.add(panel, BorderLayout.CENTER);
...