1
我有一些JRadioButtons
在ButtonGroup
。这些都在一个容器内,并且组中还有其他项目。每当我选择按钮组时,焦点总是转到组中的第一项。但是,我宁愿去选择的项目。获取焦点在JRadioButtons的ButtonGroup中,以转到当前选定的项目而不是第一个
若要重现该问题,请使用下面的代码(添加导入,并且现在忽略我懒得将它全部置于SwingUtilities.invokeLater
调用中的事实)。向下选择单选按钮,然后向下箭头至其中一个较后的项目,例如蓝色。再次点击4键返回到单选按钮,您将在顶部的“红色”单选按钮上找到焦点。我希望重点放在“蓝色”单选按钮上。
public static void main(String[] args)
{
JFrame f = new JFrame("JRadioButton Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container parent = f.getContentPane();
parent.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.gridx = 1;
gbc.gridy = 1;
parent.add(new JLabel("Start"), gbc);
gbc.gridx++;
parent.add(new JTextField(10), gbc);
gbc.gridx = 1;
gbc.gridy++;
parent.add(new JLabel("End"), gbc);
gbc.gridx++;
parent.add(new JTextField(10), gbc);
gbc.gridx = 1;
gbc.gridy++;
parent.add(new JLabel("Colors"), gbc);
gbc.gridx++;
final Box buttons = Box.createVerticalBox();
parent.add(buttons, gbc);
final ButtonGroup bg = new ButtonGroup();
for (String s : "Red,Orange,Yellow,Green,Blue,Indigo,Violet".split(","))
{
JRadioButton radioBtn = new JRadioButton(s);
buttons.add(radioBtn);
radioBtn.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e)
{
System.out.printf("Itemstate changed to %s\n",
e.getStateChange() == ItemEvent.SELECTED ? "SELECTED" : "DESELECTED");
}
});
radioBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("JRadioButton action listener");
}
});
bg.add(radioBtn);
}
gbc.gridx = 1;
gbc.gridy += 2;
gbc.gridwidth = 2;
final JLabel currentValue = new JLabel("none");
parent.add(currentValue, gbc);
gbc.gridy--;
JButton btn = new JButton("Show Button Group Value");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
ButtonModel selection = bg.getSelection();
for (int i = 0; i < buttons.getComponentCount(); i++)
{
JRadioButton radioBtn = (JRadioButton)buttons.getComponent(i);
ButtonModel loopModel = radioBtn.getModel();
if (loopModel == selection)
{
currentValue.setText(radioBtn.getText());
return;
}
currentValue.setText("none");
}
}
});
parent.add(btn, gbc);
f.pack();
f.setVisible(true);
}
我可以发誓,我已在尝试类似的东西有一点,并不能得到它的工作。您的解决方案效果非常好!那谢谢啦! – Pixelstix