Java:遍历JButton列表

Java:遍历JButton列表,java,Java,我的JPanel上有一个JButtons的数组列表。所有按钮都使用JPanel上的GridBagLayout添加到一条水平线中,如下所示 它的制作使得focusOwner按钮具有红色背景,而其他按钮具有绿色背景 我想通过用户转移注意力。例如,如果用户单击左箭头,焦点将转移到具有焦点的按钮左侧的按钮。类似地,如果他单击向右箭头,焦点将转移到focusOwner右侧的按钮 我还希望,如果用户按Enter键,focusOwner按钮get将被按下(actionListener将运行)。用于向每个JB

我的JPanel上有一个JButtons的数组列表。所有按钮都使用JPanel上的GridBagLayout添加到一条水平线中,如下所示

它的制作使得focusOwner按钮具有红色背景,而其他按钮具有绿色背景

我想通过用户转移注意力。例如,如果用户单击左箭头,焦点将转移到具有焦点的按钮左侧的按钮。类似地,如果他单击向右箭头,焦点将转移到focusOwner右侧的按钮

我还希望,如果用户按Enter键,focusOwner按钮get将被按下(actionListener将运行)。

用于向每个
JButton
注册所需的操作
用于更改聚焦按钮和非聚焦按钮的背景色。
用于移动焦点

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.KeyboardFocusManager;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.FocusEvent;
导入java.awt.event.FocusListener;
导入java.awt.event.KeyEvent;
导入javax.swing.AbstractAction;
导入javax.swing.ActionMap;
导入javax.swing.InputMap;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.KeyStroke;
导入javax.swing.WindowConstants;
公共类RedGreen实现ActionListener、FocusListener、Runnable{
私有JFrame;
已执行的公共无效操作(操作事件){
showMessageDialog(frame,event.getActionCommand());
}
获得公共无效焦点(焦点事件){
event.getComponent().setBackground(颜色为.red);
}
公共无效焦点丢失(焦点事件){
event.getComponent().setBackground(颜色为.green);
}
@凌驾
公开募捐{
showGui();
}
私有JButton createButton(int索引){
JButton按钮=新JButton(“分类账”);
setActionCommand(String.valueOf(index));
addActionListener(这个);
按钮。背景(颜色。绿色);
addFocusListener(这个);
InputMap InputMap=按钮。getInputMap();
ActionMap ActionMap=button.getActionMap();
击键输入=击键.getKeyStroke(KeyEvent.VK_enter,0);
inputMap.put(输入“ACTION”);
actionMap.put(“ACTION”,newentreaction());
击键向右箭头=击键.getKeyStroke(KeyEvent.VK_RIGHT,0);
inputMap.put(右箭头,“下一步”);
放置(“下一步”,newRightAction());
KeyStroke leftArrow=KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0);
inputMap.put(左箭头,“上一个”);
put(“PREVIOUS”,新的LeftAction());
返回按钮;
}
私有JPanel CreateButtonPanel(){
JPanel面板=新的JPanel();
添加(createButton(1));
添加(createButton(2));
面板添加(createButton(3));
面板添加(createButton(4));
返回面板;
}
私有void showGui(){
frame=新的JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createButtonsPanel(),BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
invokeLater(新的红绿();
}
私有静态类EnterAction扩展了AbstractAction{
@凌驾
已执行的公共无效操作(操作事件){
Object source=event.getSource();
if(JButton的源实例){
JButton按钮=(JButton)源;
button.doClick();
}
}
}
私有静态类LeftAction扩展了AbstractAction{
@凌驾
已执行的公共无效操作(操作事件){
KeyboardFocusManager kfm=KeyboardFocusManager.getCurrentKeyboardFocusManager();
kfm.focusPreviousComponent();
}
}
私有静态类RightAction扩展了AbstractAction{
@凌驾
已执行的公共无效操作(操作事件){
KeyboardFocusManager kfm=KeyboardFocusManager.getCurrentKeyboardFocusManager();
kfm.focusNextComponent();
}
}
}

我只是有一个小小的疑问,你是否能解决这个问题,很抱歉浪费你的时间,但是如果有第五个按钮我只想通过光标点击,有没有办法避免将焦点设置到按钮列表中的第五个按钮?非常感谢,到目前为止您帮了我很多。只需使按钮不可聚焦,即
按钮。setFocusable(false)