首页 > 解决方案 > 制作 JButton 的 ArrayList 时出错?

问题描述

我正在尝试自己编写俄罗斯方块游戏。我创建了一个处理控件的类,其中发生了以下情况:

  1. 询问玩家是否可以使用默认控件并将其列出
  2. 如果他们单击“否”,则会JFrame弹出另一个询问他们想要更改哪个按钮。这是我创建ArrayListJButtons 的地方,所以当它们都做基本相同的事情时,我不必单独制作每个。
  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);

标签: javaswingnullpointerexceptionjframe

解决方案


推荐阅读