Java JButton 的 Swing 问题 selecting/ActionPerformed
Java Swing issue with JButton selecting/ActionPerformed
我目前正在开发一款迷宫游戏,我有一个用户可以更改控件的设置,为此每个游戏控件(移动等)对应了几个按钮。要更改游戏控件,用户必须单击按钮,然后按下一个键,之后控制键应该已经更新,例如按钮文本,它应该如下所示:UP_MOVEMENT = NEW_CONTROL。
例如,如果我想将 UP_MOVEMENT 键更改为 "P" 键,我应该在 UP_MOVEMENT 按钮上单击一次,然后按 "P" 键,它应该完成。
问题是,一旦我单击按钮并按下想要的键以查看按钮的文本更改后,我必须再次单击它并且我希望它是即时的。这是我的代码的一部分:
public JPanel createKeyBidings() {
JPanel buttonBox = new JPanel();
JButton upKey = new JButton("UP="+ KeyEvent.getKeyText(settings.getUp()));
JButton downKey = new JButton("DOWN="+ KeyEvent.getKeyText(settings.getDown()));
JButton leftKey = new JButton("LEFT="+KeyEvent.getKeyText(settings.getLeft()));
JButton rigthKey=new JButton("RIGTH="+KeyEvent.getKeyText(settings.getRight()));
JButton shoot = new JButton("SHOOT");
upKey.addKeyListener(this);
downKey.addKeyListener(this);
leftKey.addKeyListener(this);
rigthKey.addKeyListener(this);
shoot.addKeyListener(this);
upKey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (keyPressed != null) {
settings.setUp(keyPressed.getKeyCode());
upKey.setText("UP=" + keyPressed.getKeyChar());
}
}
});
buttonBox.add(upKey);
buttonBox.add(downKey);
buttonBox.add(leftKey);
buttonBox.add(rigthKey);
buttonBox.add(shoot);
return buttonBox;
}
如果您想根据 KeyPressed 事件做出反应,那么您应该考虑将逻辑放在 KeyListener 方法中。换句话说,不是将最后按下的键保存在 keyPressed 变量中,而是保存每次触发 ActionListener 时设置的 buttonPressed 变量。当按下一个键时,检查最后按下的是哪个按钮并做出相应的反应。如果您希望仅在按住按钮时做出反应(按下并且在释放之前而不是在释放之后 - 当 ActionListener 被触发时),那么在 KeyListener 中您可以通过检查按下按钮来评估按下了哪个按钮它是模型(例如 if ( myButton.getModel().isPressed() )
这可能是新手 "work around"(因为我是 Java/Swing 的新手)但请尝试在更新按钮文本后立即刷新 JFrame
:
SwingUtilities.updateComponentTreeUI(yourJFrame);
或者,如果这不起作用,请尝试:
yourJFrame.invalidate();
yourJFrame.validate();
yourJFrame.repaint();
我目前正在开发一款迷宫游戏,我有一个用户可以更改控件的设置,为此每个游戏控件(移动等)对应了几个按钮。要更改游戏控件,用户必须单击按钮,然后按下一个键,之后控制键应该已经更新,例如按钮文本,它应该如下所示:UP_MOVEMENT = NEW_CONTROL。 例如,如果我想将 UP_MOVEMENT 键更改为 "P" 键,我应该在 UP_MOVEMENT 按钮上单击一次,然后按 "P" 键,它应该完成。 问题是,一旦我单击按钮并按下想要的键以查看按钮的文本更改后,我必须再次单击它并且我希望它是即时的。这是我的代码的一部分:
public JPanel createKeyBidings() {
JPanel buttonBox = new JPanel();
JButton upKey = new JButton("UP="+ KeyEvent.getKeyText(settings.getUp()));
JButton downKey = new JButton("DOWN="+ KeyEvent.getKeyText(settings.getDown()));
JButton leftKey = new JButton("LEFT="+KeyEvent.getKeyText(settings.getLeft()));
JButton rigthKey=new JButton("RIGTH="+KeyEvent.getKeyText(settings.getRight()));
JButton shoot = new JButton("SHOOT");
upKey.addKeyListener(this);
downKey.addKeyListener(this);
leftKey.addKeyListener(this);
rigthKey.addKeyListener(this);
shoot.addKeyListener(this);
upKey.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (keyPressed != null) {
settings.setUp(keyPressed.getKeyCode());
upKey.setText("UP=" + keyPressed.getKeyChar());
}
}
});
buttonBox.add(upKey);
buttonBox.add(downKey);
buttonBox.add(leftKey);
buttonBox.add(rigthKey);
buttonBox.add(shoot);
return buttonBox;
}
如果您想根据 KeyPressed 事件做出反应,那么您应该考虑将逻辑放在 KeyListener 方法中。换句话说,不是将最后按下的键保存在 keyPressed 变量中,而是保存每次触发 ActionListener 时设置的 buttonPressed 变量。当按下一个键时,检查最后按下的是哪个按钮并做出相应的反应。如果您希望仅在按住按钮时做出反应(按下并且在释放之前而不是在释放之后 - 当 ActionListener 被触发时),那么在 KeyListener 中您可以通过检查按下按钮来评估按下了哪个按钮它是模型(例如 if ( myButton.getModel().isPressed() )
这可能是新手 "work around"(因为我是 Java/Swing 的新手)但请尝试在更新按钮文本后立即刷新 JFrame
:
SwingUtilities.updateComponentTreeUI(yourJFrame);
或者,如果这不起作用,请尝试:
yourJFrame.invalidate();
yourJFrame.validate();
yourJFrame.repaint();