Координация двух `ButtonGroup` - PullRequest
1 голос
/ 15 марта 2012

У меня есть группа 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);

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Я не знаю, как именно вы это делаете, но этот код работает для меня:

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


    }
}
1 голос
/ 12 июля 2012

Вы можете связать состояние любых двух (или более) кнопок, поделившись между ними моделью кнопки, в этом случае:

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

Таким образом, вы можете избежать вызова putValue(Action.SELECTED_KEY, true).Не уверен, действительно ли это улучшение, но мне оно нравится больше.

...