1

所以我必须为分配创建一个 jTextbox 和一个键盘。当我输入时,我需要相应的 jButton 来改变颜色。

所以目前,当我运行时,焦点在jTextbox上,我可以输入,但我不能将焦点设置到按钮上。

一些帮助将不胜感激。谢谢

private void aButtonKeyPressed(java.awt.event.KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_A)
    {
       aButton.setBackground(Color.red);           
    } 
}

private void aButtonKeyReleased(java.awt.event.KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_A)
    {
        aButton.setBackground(Color.LIGHT_GRAY);
    }
}

private void sButtonKeyPressed(java.awt.event.KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_S)
    {
       sButton.setBackground(Color.red);           
    }
}

private void sButtonKeyReleased(java.awt.event.KeyEvent evt) {
    if (evt.getKeyCode() == KeyEvent.VK_S)
    {
       sButton.setBackground(Color.LIGHT_GRAY);           
    }
}
4

3 回答 3

2

有一个实现 KeyListener 的公共类并将该类提供给 JButtons。

有一个 Map 来存储 Key Code 和 JButton

Map<Integer, JButton> keyCodeButtonMap = new HashMap<Integer, JButton>();
keyCodeButtonMap.put(KeyEvent.VK_A, aButton); // Example

将所有 KeyEvent 虚拟键与正确的按钮一起添加到地图中。

private void buttonKeyPressed(java.awt.event.KeyEvent evt) {
    keyCodeButtonMap.get(evt.getKeyCode()).setBackground(Color.RED);
    keyCodeButtonMap.get(evt.getKeyCode()).setForeground(Color.RED);
}

private void buttonKeyReleased(java.awt.event.KeyEvent evt) {
    keyCodeButtonMap.get(evt.getKeyCode()).setBackground(Color.LIGHT_GRAY);
    keyCodeButtonMap.get(evt.getKeyCode()).setForeground(Color.LIGHT_GRAY);
}

理想情况下,这应该有效。

于 2012-12-12T06:23:22.090 回答
1

我认为您不想将焦点设置为JButton(否则您将无法输入JTextArea/JTextField等),也许您希望它更改颜色并在输入某个字符时使其单击?

  • 使用 Swing 组件时,请按照其他人的建议使用KeyBindings 。

这是我做的一个例子:

在此处输入图像描述

.被按下时,按钮背景将变为蓝色(并且按钮方法将调用SPACE在“。”之后自动插入):

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class Test {

    final JFrame frame = new JFrame();
    final JTextField jtf = new JTextField(15);
    final JButton button = new JButton("SPACE");

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }

    private void initComponents() {

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                insertSpace();
            }
        });

        final Color defaultColor = button.getBackground();

        jtf.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 0, true), "period rel");
        jtf.getActionMap().put("period rel", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                //button.doClick(); //I dont like this as it makes JBUtton look like its being clicked where as we want a color change
                insertSpace();
                button.setBackground(defaultColor);
            }
        });

        jtf.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 0), "period pressed");
        jtf.getActionMap().put("period pressed", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                button.setBackground(Color.CYAN);
            }
        });

        frame.add(jtf, BorderLayout.NORTH);
        frame.add(button, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    private void insertSpace() {
        String s = jtf.getText();
        jtf.setText(s + " ");
    }
}
于 2012-12-12T07:25:13.103 回答
0

您可能想查看KeyBindings
但如果你真的想要 KeyListener,试试这个。

    yourJtextField.addKeyListener(new KeyAdapter() {

       @Override
       public void keyPressed(KeyEvent e){
          if( e.getKeyCode() == KeyEvent.VK_A ){
             aButton.setBackground(yourColor);
          }
       }

       @Override
       public void keyReleased(KeyEvent e){
          aButton.setBackground(yourDefaultColor);
       }

    });

于 2012-12-12T06:22:49.933 回答