键入按钮时,JButton不会改变颜色

时间:2014-08-01 04:57:06

标签: java swing colors jbutton keylistener

我有一个非常小的问题。现在我编写了用于创建虚拟键盘的代码。我想要在键入时更改按钮的颜色。这是我的代码:

public class ButtonColor implements KeyListener {

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e) {
        if (e.getKeyChar()=='a') {
            A.setBackground(Color.red);
        }

    }

}

每当我按A时,都没有任何反应。当我添加这一行时:

JOptionPane.showMessageDialog(null, "A was typed");

然后键入a,出现消息,单击“确定”后按钮将更改颜色。为什么会这样?我该如何解决这个问题?

enter image description here

1 个答案:

答案 0 :(得分:3)

为什么这对你不起作用可能有很多原因,对于初学者来说,按钮可能是透明的(opaque == false

我强烈建议不要KeyListener支持Key Bindings,因为KeyListener有焦点问题......

例如......

以下使用键绑定API以响应给定的键击,取决于它是按键还是释放事件,它将相应地设置背景颜色和不透明度状态,甚至设置按钮按下状态。

Keyboard

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class KeyboardTest {

    public static void main(String[] args) {
        new KeyboardTest();
    }

    public KeyboardTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JButton btnA = createButton("A");
            JButton btnB = createButton("B");
            JButton btnC = createButton("C");
            JButton btnD = createButton("D");
            JButton btnE = createButton("E");

            add(btnA);
            add(btnB);
            add(btnC);
            add(btnD);
            add(btnE);

            addKeyBinding(btnA, "A", KeyEvent.VK_A);
            addKeyBinding(btnB, "B", KeyEvent.VK_B);
            addKeyBinding(btnC, "C", KeyEvent.VK_C);
            addKeyBinding(btnD, "D", KeyEvent.VK_D);
            addKeyBinding(btnE, "E", KeyEvent.VK_E);

        }

        protected JButton createButton(String text) {
            JButton btn = new JButton(text);
            btn.setFocusable(false);
            return btn;
        }

        protected void addKeyBinding(JButton btn, String name, int virtualKey) {
            ActionMap am = getActionMap();
            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);

            im.put(KeyStroke.getKeyStroke(virtualKey, 0, false), name + ".pressed");
            im.put(KeyStroke.getKeyStroke(virtualKey, 0, true), name + ".released");

            am.put(name + ".pressed", new KeyAction(btn, true));
            am.put(name + ".released", new KeyAction(btn, false));
        }

    }

    public class KeyAction extends AbstractAction {

        private JButton btn;
        private boolean highlight;

        public KeyAction(JButton btn, boolean highlight) {
            this.btn = btn;
            this.highlight = highlight;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (highlight) {
                btn.getModel().setPressed(true);
                btn.setBackground(Color.RED);
                btn.setOpaque(true);
            } else {
                btn.getModel().setPressed(false);
                btn.setBackground(null);
                btn.setOpaque(false);
            }
        }

    }

}

<强>更新

如果您还使用btn.getModel().setArmed(...);,您将获得更加“粗体”的响应,从而产生更好的视觉反馈...恕我直言