A coordenação de duas `ButtonGroup`
-
14-12-2019 - |
Pergunta
Eu tenho um grupo de 3 JRadioButtonMenuItem
em um menu, e 3 JToggleButton
em uma barra de ferramentas.Cada um deles está vinculado a 3 Action
, de modo que quando eu desativar uma ação, tanto que o item correspondente e o botão estará desativado.
Quando eu clicar num item de menu, eu seria de esperar, também, o respectivo botão da barra de ferramentas para ser selecionado, mas parece que o "unclicked" grupo tem a sua própria maneira estranha para reagir a esses eventos (com um padrão que se eu não tentar identificar).
Aqui está o menu de código de grupo (simplificado):
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);
e aqui o grupo de ferramentas de código:
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);
Solução
Eu não sei exatamente como você está fazendo isso, mas esse código é trabalhar para mim:
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);
}
}
}
Outras dicas
Você pode vincular o estado de um dos dois (ou mais) botões de compartilhamento no botão modelo entre eles, neste caso:
itemA.setModel(buttonA.getModel());
itemB.setModel(buttonB.getModel());
itemC.setModel(buttonC.getModel());
De que forma você pode evitar chamar a putValue(Action.SELECTED_KEY, true)
.Não tenho certeza se isso é na verdade uma melhoria, mas eu gosto mais.