首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协调两个`ButtonGroup`

协调两个`ButtonGroup`
EN

Stack Overflow用户
提问于 2012-03-15 08:02:12
回答 3查看 619关注 0票数 1

我在菜单中有一组3个JRadioButtonMenuItem,在工具栏中有3个JToggleButton。它们每个都绑定到3个Action,所以当我禁用一个操作时,相应的项和按钮都将被禁用。

当我点击一个菜单项时,我希望相应的工具栏按钮也会被选中,但似乎“未点击”组有自己奇怪的方式来对这些事件做出反应(有一种我没有尝试识别的模式)。

以下是菜单组码(简化):

代码语言:javascript
复制
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);

和这里的工具栏组码:

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-15 10:24:40

我不知道你到底是怎么做的,但这段代码对我来说是有效的:

代码语言:javascript
复制
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);
        }   


    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-07-12 16:34:12

您可以通过在任意两个(或更多)按钮之间共享按钮模型来链接这些按钮的状态,在本例中:

代码语言:javascript
复制
itemA.setModel(buttonA.getModel());
itemB.setModel(buttonB.getModel());
itemC.setModel(buttonC.getModel());

这样就可以避免调用putValue(Action.SELECTED_KEY, true)。我不确定这是否真的是一种进步,但我确实更喜欢它。

票数 1
EN

Stack Overflow用户

发布于 2020-07-18 04:24:00

根据记录(几年后),这是由于Java6中的一项更改。您可以查看JDK-6397556中的一些讨论,但简短的版本是因为完全将有状态按钮绑定到操作需要按钮将该状态(选中还是未选中)推回到操作中,他们不想破坏不期望的现有程序。

因此,如果要从操作构造切换按钮,并且希望按钮的初始选中状态遵循操作的选中状态,则必须在创建按钮之前通过将Action.SELECTED_KEY设置为非空布尔值来选择加入:

代码语言:javascript
复制
Action action = .....;
action.putValue (Action.SELECTED_KEY, Boolean.TRUE);
JCheckBox checkbox = new JCheckBox(action);

显然,传递Boolean.FALSE以将它们完全绑定在一起,初始状态为“未选中”。(如果您的代码已经在其他一些布尔变量中确定了初始选择状态,那么只需执行Boolean.valueOf(initiallySelectedOrNot)就可以了,或者您可以依赖于自动装箱。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9712162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档