Я пытаюсь написать игру в тетрис самостоятельно. Я создал класс, который обрабатывает элементы управления, в котором происходит следующее:
- Спрашивает, согласен ли игрок с элементами управления по умолчанию, и выводит их список
- Если они нажимают нет, тогда другое
JFrame
выскакивает, спрашивая, какую кнопку они хотят изменить. Здесь я создаю ArrayList
кнопок J, поэтому мне не нужно создавать каждый из них по отдельности, когда все они делают одно и то же. - Когда кто-то нажимает на один из элементов управления, он появляется с другим 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);