Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 协调两个按钮组`_Java_Swing_Buttongroup - Fatal编程技术网

Java 协调两个按钮组`

Java 协调两个按钮组`,java,swing,buttongroup,Java,Swing,Buttongroup,我在菜单中有一组3JRadioButtonMenuItem,在工具栏中有3JToggleButton。它们中的每一个都绑定到3操作,因此当我禁用一个操作时,相应的项目和按钮都将被禁用 当我点击一个菜单项时,我希望相应的工具栏按钮也被选中,但“未点击”组似乎有自己的奇怪方式来应对这些事件(我没有尝试识别这种模式) 以下是菜单组代码(简化): 下面是工具栏组代码: ButtonGroup toolbarGrp = new ButtonGroup(); JToggleButton buttonA =

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

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

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

下面是工具栏组代码:

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);

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

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);
        }   


    }
}

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

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);
        }   


    }
}

您可以通过在任意两个(或多个)按钮之间共享按钮模型来链接它们的状态,在这种情况下:

itemA.setModel(buttonA.getModel());
itemB.setModel(buttonB.getModel());
itemC.setModel(buttonC.getModel());

这样可以避免调用
putValue(Action.SELECTED\u键,true)
。不确定这是否真的是一种改进,但我更喜欢它。

您可以通过在任意两个(或更多)按钮之间共享按钮模型来链接它们的状态,在这种情况下:

itemA.setModel(buttonA.getModel());
itemB.setModel(buttonB.getModel());
itemC.setModel(buttonC.getModel());
这样可以避免调用
putValue(Action.SELECTED\u键,true)
。不确定这是否真的是一种改进,但我更喜欢它。

记录在案(几年后),这是由于Java 6中的一项更改。您可以看到一些讨论,但简短的版本是,因为将有状态按钮完全绑定到操作需要按钮将该状态(选择的与未选择的)推回到操作中,所以他们不想破坏未预料到的现有程序

因此,如果要从动作构造切换按钮,并且希望按钮的初始选定状态跟随动作的选定状态,则必须通过将
Action.selected\u KEY
设置为非空布尔值来选择加入,然后再创建按钮:

Action action = .....;
action.putValue (Action.SELECTED_KEY, Boolean.TRUE);
JCheckBox checkbox = new JCheckBox(action);
显然,通过
Boolean.FALSE
将它们完全绑定在一起,初始状态为“notselected”。(如果您的代码已经在其他布尔变量中确定了初始选择状态,那么只需执行
boolean.valueOf(initiallySelectedOrNot)
即可,或者您可以依赖自动装箱到DTRT。)

对于记录(几年后),这是由于Java 6中所做的更改。您可以看到一些讨论,但简短的版本是,因为将有状态按钮完全绑定到操作需要按钮将该状态(选择的与未选择的)推回到操作中,所以他们不想破坏未预料到的现有程序

因此,如果要从动作构造切换按钮,并且希望按钮的初始选定状态跟随动作的选定状态,则必须通过将
Action.selected\u KEY
设置为非空布尔值来选择加入,然后再创建按钮:

Action action = .....;
action.putValue (Action.SELECTED_KEY, Boolean.TRUE);
JCheckBox checkbox = new JCheckBox(action);

显然,通过
Boolean.FALSE
将它们完全绑定在一起,初始状态为“notselected”。(如果您的代码已经在其他布尔变量中确定了初始选择状态,则只需执行
boolean.valueOf(initiallySelectedOrNot)
即可,或者您可以依赖自动装箱到DTRT。)

将buttonB添加到toolbarGrp两次。这仅仅是一个输入错误,或者你在代码中有它吗?你将buttonB添加到toolbarGrp两次。这只是一个输入错误,或者你在代码中有它吗?实际上,我正在为每个对应的夫妇(itemA buttonA->actionA,…)共享操作,根据,他们应该共享操作的状态,而无需手动选择。我试图修改您的代码以反映我的代码:启用状态确实是共享的(就像在我的代码中一样),但现在一个组忽略了另一个组的选择。我不明白为什么在我的代码中,这最后一件事是有效的(尽管是部分的)。最后,我在每个
actionPerformed()
中调用
putValue(Action.SELECTED\u KEY,true)
,这就像手动选择操作而不是组件一样。谢谢。事实上,我正在为每个对应的夫妇(itemA buttonA->actionA,…)共享操作,根据,他们应该在不手动选择的情况下共享操作的状态。我试图修改您的代码以反映我的代码:启用状态确实是共享的(就像在我的代码中一样),但现在一个组忽略了另一个组的选择。我不明白为什么在我的代码中,这最后一件事是有效的(尽管是部分的)。最后,我在每个
actionPerformed()
中调用
putValue(Action.SELECTED\u KEY,true)
,这就像手动选择操作而不是组件一样。非常感谢。