JButton选择/ ActionPerformed的Java Swing问题

时间:2015-04-12 19:24:09

标签: java swing jbutton

我目前正在开发迷宫游戏,我有一个用户可以更改控件的设置,为了做到这一点,有几个按钮对应每个游戏控件(移动......等)。要更改游戏控件,用户必须单击按钮,然后按一个键,然后控制键应该已更新,如按钮文本,它应如下所示: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;
}

2 个答案:

答案 0 :(得分:1)

如果您想根据KeyPressed事件做出反应,那么您应该考虑将逻辑放在KeyListener方法中。换句话说,不是在keyPressed变量中保持最后一个键,而是保持每次触发ActionListener时设置的buttonPressed变量。按下按键时,检查上次按下哪个按钮并做出相应的反应。如果您希望仅在按钮被按下时(按下并且在释放按钮之后而不是在释放之后 - 当激活ActionListener时),则在KeyListener中,您可以通过检查按下按钮来评估按下了哪个按钮它的模型(例如if(myButton.getModel()。isPressed())

答案 1 :(得分:0)

这可能是一个新手“解决”(因为我是Java / Swing的新手)但是在用以下内容更新按钮文本后立即尝试刷新JFrame

SwingUtilities.updateComponentTreeUI(yourJFrame);

如果这不起作用,请尝试:

yourJFrame.invalidate();
yourJFrame.validate();
yourJFrame.repaint();