2014-12-07 104 views
0

我注意到,動作事件仍然會我集團JRadioButtonMenuItem內被觸發,即使指定的條件語句:有動作事件調用時未選擇單選按鈕

if(!button.isSelected()) 
    //Do stuff 

defaultTheme = new JRadioButtonMenuItem("Default theme"); 
    defaultTheme.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if(!defaultTheme.isSelected()) 
       System.out.println("temp"); 
     } 
    }); 

我在我的設置菜單中有多個主題選項,但是如果說(說默認)已被選中,我不想執行任何冗餘代碼,如果默認菜單已經被選擇並且用戶點擊已經選擇的單選按鈕。

+0

這是一個有點模糊,但你能不能只使用'if-else'語句? – MadProgrammer 2014-12-07 21:19:43

+0

@MadProgrammer - 我試過......甚至在不否定它的情況下嘗試了條件,並且打印出「temp」,而不管該按鈕是否被選中,哪個是奇怪的。 – Juxhin 2014-12-07 21:21:09

+0

考慮提供一個[runnable示例](https://stackoverflow.com/help/mcve),它演示你的問題。這會減少混淆和更好的響應 – MadProgrammer 2014-12-07 23:07:44

回答

1

ActionListener會告訴你什麼時候按鈕是「動作」(點擊,按下,什麼),這並不總是改變它的狀態。相反,你可以附上ItemListener的按鈕模式,它會告訴,更準確地,當按鈕變化的實際狀態,例如...

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class ButtonTest { 

    public static void main(String[] args) { 
     new ButtonTest(); 
    } 

    public ButtonTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      ButtonGroup bg = new ButtonGroup(); 
      final JRadioButton bananas = new JRadioButton("Bananas"); 
      final JRadioButton apples = new JRadioButton("Apples"); 
      bg.add(bananas); 
      bg.add(apples); 

      bananas.getModel().addItemListener(new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent e) { 
        System.out.println("Bananas " + bananas.isSelected()); 
       } 
      }); 
      apples.getModel().addItemListener(new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent e) { 
        System.out.println("Apples " + apples.isSelected()); 
       } 
      }); 

      add(bananas, gbc); 
      add(apples, gbc); 

     } 

    } 

} 
+0

非常完美,非常感謝深入的代碼示例。 – Juxhin 2014-12-08 07:07:58

+0

很高興幫助... – MadProgrammer 2014-12-08 07:09:08

0

不確定,因爲我沒有看到你的程序的其餘部分,但你必須把所有的單選按鈕放在一個ButtonGroup中。因爲如果你不這樣做,就不可能取消選擇單選按鈕。

+0

它們已經在ButtonGroup中,因此在任何給定時間只能選擇一個RadioButton。 – Juxhin 2014-12-07 21:55:24