我在菜单中有一组3个JRadioButtonMenuItem,在工具栏中有3个JToggleButton。它们每个都绑定到3个Action,所以当我禁用一个操作时,相应的项和按钮都将被禁用。
当我点击一个菜单项时,我希望相应的工具栏按钮也会被选中,但似乎“未点击”组有自己奇怪的方式来对这些事件做出反应(有一种我没有尝试识别的模式)。
以下是菜单组码(简化):
ButtonGroup menuGrp = new ButtonGroup();
JRadioButtonMenuItem itemA = new JRadioButtonMenuItem(actionA);
JRadioButtonMenuItem itemB = new JRadioButtonMenuItem(actionB);
JRadioButtonMenuItem itemC = new JRadioButtonMenuItem(actionC);
menuGrp.add(itemA);
menuGrp.add(itemB);
menuGrp.add(itemC);
itemA.setSelected(true);和这里的工具栏组码:
ButtonGroup toolbarGrp = new ButtonGroup();
JToggleButton buttonA = new JToggleButton(actionA);
JToggleButton buttonB = new JToggleButton(actionB);
JToggleButton buttonC = new JToggleButton(actionC);
toolbarGrp.add(buttonA);
toolbarGrp.add(buttonB);
toolbarGrp.add(buttonB);
buttonA.setSelected(true);发布于 2012-03-15 10:24:40
我不知道你到底是怎么做的,但这段代码对我来说是有效的:
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JToggleButton;
public class Button
{
public static void main(String[] args){
JFrame frame = new JFrame();
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("Foo");
ButtonGroup menuGrp = new ButtonGroup();
JRadioButtonMenuItem itemA = new JRadioButtonMenuItem();
JRadioButtonMenuItem itemB = new JRadioButtonMenuItem();
JRadioButtonMenuItem itemC = new JRadioButtonMenuItem();
menuGrp.add(itemA);
menuGrp.add(itemB);
menuGrp.add(itemC);
menu.add(itemA);
menu.add(itemB);
menu.add(itemC);
itemA.setSelected(true);
bar.add(menu);
frame.setJMenuBar(bar);
JPanel content = new JPanel();
ButtonGroup toolbarGrp = new ButtonGroup();
JToggleButton buttonA = new JToggleButton();
JToggleButton buttonB = new JToggleButton();
JToggleButton buttonC = new JToggleButton();
toolbarGrp.add(buttonA);
toolbarGrp.add(buttonB);
toolbarGrp.add(buttonC);
buttonA.setSelected(true);
content.add(buttonA);
content.add(buttonB);
content.add(buttonC);
itemA.setAction(new MyAction(buttonA));
itemB.setAction(new MyAction(buttonB));
itemC.setAction(new MyAction(buttonC));
buttonA.setAction(new MyAction(itemA));
buttonB.setAction(new MyAction(itemB));
buttonC.setAction(new MyAction(itemC));
frame.setContentPane(content);
frame.setSize(300, 300);
frame.setVisible(true);
}
static class MyAction extends AbstractAction
{
AbstractButton button;
public MyAction(AbstractButton button){
this.button = button;
}
@Override public void actionPerformed(ActionEvent e){
button.setSelected(true);
}
}
}发布于 2012-07-12 16:34:12
您可以通过在任意两个(或更多)按钮之间共享按钮模型来链接这些按钮的状态,在本例中:
itemA.setModel(buttonA.getModel());
itemB.setModel(buttonB.getModel());
itemC.setModel(buttonC.getModel());这样就可以避免调用putValue(Action.SELECTED_KEY, true)。我不确定这是否真的是一种进步,但我确实更喜欢它。
发布于 2020-07-18 04:24:00
根据记录(几年后),这是由于Java6中的一项更改。您可以查看JDK-6397556中的一些讨论,但简短的版本是因为完全将有状态按钮绑定到操作需要按钮将该状态(选中还是未选中)推回到操作中,他们不想破坏不期望的现有程序。
因此,如果要从操作构造切换按钮,并且希望按钮的初始选中状态遵循操作的选中状态,则必须在创建按钮之前通过将Action.SELECTED_KEY设置为非空布尔值来选择加入:
Action action = .....;
action.putValue (Action.SELECTED_KEY, Boolean.TRUE);
JCheckBox checkbox = new JCheckBox(action);显然,传递Boolean.FALSE以将它们完全绑定在一起,初始状态为“未选中”。(如果您的代码已经在其他一些布尔变量中确定了初始选择状态,那么只需执行Boolean.valueOf(initiallySelectedOrNot)就可以了,或者您可以依赖于自动装箱。)
https://stackoverflow.com/questions/9712162
复制相似问题