Java 如何在键入键事件时更改JButton颜色?
我的项目是创建一个虚拟键盘,当用户在键盘上键入相应的按钮时,键盘上的按钮必须改变颜色。 即如果我键入“e”,虚拟键盘上的字母“e”必须改变颜色 为了绘制我的键盘,我使用了一个2D JButton数组和一个2D字符串数组来命名按钮并分配它们各自的标签,然后我为每个按钮添加了一个KeyListener界面,在该界面中我指示程序更改按钮的颜色。编译它对我来说很好,但实际的颜色变化不起作用。有人能帮忙吗? 这是密码Java 如何在键入键事件时更改JButton颜色?,java,swing,background,jbutton,keylistener,Java,Swing,Background,Jbutton,Keylistener,我的项目是创建一个虚拟键盘,当用户在键盘上键入相应的按钮时,键盘上的按钮必须改变颜色。 即如果我键入“e”,虚拟键盘上的字母“e”必须改变颜色 为了绘制我的键盘,我使用了一个2D JButton数组和一个2D字符串数组来命名按钮并分配它们各自的标签,然后我为每个按钮添加了一个KeyListener界面,在该界面中我指示程序更改按钮的颜色。编译它对我来说很好,但实际的颜色变化不起作用。有人能帮忙吗? 这是密码 private JButton spButton, oneButton, two
private JButton spButton, oneButton, twoButton, threeButton, fourButton, fiveButton, sixButton, sevenButton, eightButton,
nineButton, zeroButton, dashButton, equalsButton, bspButton, tabButton, qButton, wButton, eButton,
rButton, tButton, yButton, uButton, iButton, oButton, pButton, rBracketButton, lBracketButton, slashButton,
capsButton, aButton, sButton, dButton, fButton, gButton, hButton, jButton, kButton, lButton, scButton,
sqButton, enterButton, lShiftButton, zButton, xButton, cButton, vButton, bButton, nButton, mButton,
commaButton, periodButton, bSlashButton, rShiftButton, upButton, spaceButton, leftButton, downButton,
rightButton;
private JButton [][] buttonArray = {{spButton, oneButton, twoButton, threeButton, fourButton, fiveButton,
sixButton,sevenButton, eightButton, nineButton, zeroButton, dashButton, equalsButton, bspButton},
{tabButton, qButton, wButton, eButton, rButton, tButton, yButton, uButton,
iButton, oButton, pButton, rBracketButton, lBracketButton, slashButton},
{capsButton, aButton, sButton, dButton, fButton, gButton, hButton,
jButton, kButton, lButton, scButton, sqButton, enterButton},
{lShiftButton, zButton, xButton, cButton, vButton, bButton, nButton, mButton,
commaButton, periodButton, bSlashButton, rShiftButton, upButton},
{spaceButton, leftButton, downButton, rightButton}};
private char pressed;
public constructor(){
addKeyListener(new KeyEventsHandler());
}
private class KeyEventsHandler implements KeyListener {
@Override
public void keyTyped(KeyEvent e) {
pressed = e.getKeyChar();
for (int row = 0; row < keyBoard.length; row ++){
for (int column = 0; column < keyBoard[row].length; column ++){
if (pressed==buttonArray[row][column].getName().toLowerCase().charAt(0))
buttonArray[row][column].setForeground(Color.RED);
keyboardPanel.repaint();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
}
private JButton spButton,一个按钮,两个按钮,三个按钮,四个按钮,五个按钮,六个按钮,七个按钮,八个按钮,
nineButton、Zero按钮、dashButton、EqualButton、BSP按钮、tabButton、qButton、WBButton、EBButton、,
B按钮,T按钮,Y按钮,B按钮,I按钮,B按钮,B按钮,B按钮,B按钮,B按钮,B按钮,B按钮,B按钮,
capsButton,aButton,sButton,dButton,fButton,gButton,hButton,jButton,kButton,lButton,scButton,
sqButton、enterButton、Lshift Button、zButton、xButton、CbButton、VbButton、BbButton、NbButton、mButton、,
commaButton、Period按钮、BSLASH按钮、RSShift按钮、Up按钮、spaceButton、leftButton、downButton、,
右键;
私有JButton[][]按钮ray={{{spButton,one button,two button,threeButton,fourButton,fiveButton,
六按钮、七按钮、八按钮、九按钮、零按钮、仪表板按钮、相等按钮、bspButton},
{tabButton,qButton,WBButton,EBButton,RBButton,TBButton,yButton,UBButton,
iButton、oButton、pButton、rBracketButton、lBracketButton、slashButton},
{capsButton,aButton,sButton,dButton,fButton,gButton,hButton,
jButton、kButton、lButton、scButton、sqButton、enterButton},
{lShiftButton、zButton、xButton、cbButton、vbButton、bbButton、nbButton、mButton、,
commaButton、Period Button、BSLASH Button、RSShift Button、upButton},
{spaceButton、leftButton、downButton、rightButton};
私家车;
公共构造函数(){
addKeyListener(新的KeyEventsHandler());
}
私有类KeyEventsHandler实现KeyListener{
@凌驾
public void keyTyped(KeyEvent e){
按下=e.getKeyChar();
for(int row=0;row
提前感谢各位- 我没有注意,但@mKobel通知我:由于您使用的是类似
的组件数组,它来自控制组件does action家族,因此我们应该使用JButton
功能或使用,这是更高级别的实现addActionListener(ActionListener)注册
ActionListener
- 对于其他容器组件,而不是
S:键侦听器作为键盘输入的低级接口,但对于响应单个键,键绑定更合适,并且往往导致更易于维护的代码。如果要在组件没有焦点时激活键绑定,则键侦听器也很困难keylister
- 尝试使用
获取事件的源组件,而不是使用e.getSource()
循环检测此类事件for
event.getSource()
的强大功能,而不是使用长句。还有其他更理想的选择来做简单的事情
GridLayout layout = new GridLayout(0, 4);
jPanel1.setLayout(layout);
Action action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.err.println("Event generated for source: "+((JButton)e.getSource()).getName());
}
};
for(int i=0 ;i<4; i++)
for(int j=0; j<4; j++)
{
String key = ""+(char)('A' + i * 4 + j);
JButton button = new JButton(key);
button.setName(key);
button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), "doAction");
button.getActionMap().put("doAction", action);
jPanel1.add(button);
}
GridLayout=newgridlayout(0,4);
jPanel1.setLayout(布局);
Action Action=newAbstractAction(){
@凌驾
已执行的公共无效操作(操作事件e){
System.err.println(“为源生成的事件:”+((JButton)e.getSource()).getName());
}
};
对于(int i=0;i
- 我没有注意,但@mKobel通知我:由于您使用的是类似
JButton
的组件数组,它来自控制组件does action家族,因此我们应该使用addActionListener(ActionListener)注册ActionListener
功能或使用,这是更高级别的实现
- 对于其他容器组件,而不是
KeyListener
S:键侦听器作为键盘输入的低级接口,但对于响应单个键来说,键绑定更合适,并且往往导致更易于维护的代码。如果在他没有焦点
- 尝试使用
e.getSource()
获取事件的源组件,而不是使用for
循环检测此类事件
编辑:
回应@predi的评论如下:
e、 getSource()将返回带有