2012-03-15 13 views
1

私はメニューに3 JRadioButtonMenuItemのグループを持ち、ツールバーに3 JToggleButtonのグループを持っています。それぞれが3 Actionにバインドされているため、1つのアクションを無効にすると、対応するアイテムとボタンの両方が無効になります。2つの「ButtonGroup」を調整する

メニュー項目をクリックすると、対応するツールバーボタンも選択されると予想されますが、「クリックされていない」グループには、これらのイベントに反応する独自の奇妙な方法があります(パターンは、識別しようとしないでください)。

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に2回追加します。それはちょうどタイプミスか、コード内にありますか? –

+0

いいえ、それはタイプミスです。 – bigstones

答えて

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

実際には、[Javadocs](http://docs.oracle.com/javase/7/docs/api/javax/swing/)に従って、対応する各カップル(itemA buttonA - > actionA、...)のアクションを共有しています。 Action.html#SELECTED_KEY)、手動で選択することなくActionの状態を共有する必要があります。私は私のコードを反映するためにあなたのコードを修正しようとしました:enabled状態は実際に(私のコードのように)共有されていますが、今では一方のグループはもう一方の選択を無視します。そして、なぜ私のコードでこの最後のことが機能するのか(部分的には分かるが)理解できない。 – bigstones

+1

とにかく私は正しい道に私を入れます。最後に、各actionPerformed()で 'putValue(Action.SELECTED_KEY、true)'を呼び出すことで解決しました。これは、コンポーネントではなくアクションを手動で選択するようなものです。ありがとうございました。 – bigstones

1

ボタンモデルを共有することで、2つ(またはそれ以上)のボタンの状態をリンクできます、この場合には:

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

そのように、あなたはputValue(Action.SELECTED_KEY, true)を呼び出さないようにすることができます。それが実際に改善されているかどうかはわかりませんが、私はそれがもっと好きです。

関連する問題