2012-03-15 62 views
1

我有一个3 JRadioButtonMenuItem在一个菜单中,和3 JToggleButton在工具栏中的组。它们中的每一个都绑定到3 Action,这样当我禁用一个动作时,相应的项目和按钮都将被禁用。协调两个`ButtonGroup`

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

这里的菜单组代码(简化):

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

您将buttonB添加到toolbarGrp两次。这只是一个错字,或者你是否有代码? – 2012-03-15 02:15:01

+0

不,这是一个错字。 – bigstones 2012-03-15 08:48:16

回答

2

我不知道究竟怎么了,你这样做,但是这个代码工作对我来说:

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

其实我分享每个相应的夫妇的行动(itemA buttonA - > actionA,...)根据[Javadocs](http://docs.oracle.com/javase/7/docs/api/javax/swing/ Action.html#SELECTED_KEY),他们应该共享Action的状态而不用手动选择。我试图修改你的代码以反映我的和:启用状态确实是共享的(就像我的代码中那样),但是现在一个组忽略了其他的选择。我不明白为什么在我的代码中这最后一件事情(虽然部分)。 – bigstones 2012-03-15 10:09:23

+1

无论如何,你把我放在正确的道路上。我终于通过在每个'actionPerformed()'中调用'putValue(Action.SELECTED_KEY,true)'来解决问题,这就像手动选择操作而不是组件。谢谢。 – bigstones 2012-03-15 10:19:27

1

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

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

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