2009-08-19 115 views
9

有人請向我解釋爲什麼當您將鼠標移動到複選框上時,爲什麼這段代碼會打印到控制檯?發生什麼「變化」事件?JCheckbox更改偵聽器獲取鼠標事件通知

import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JCheckBox c = new JCheckBox("Print HELLO"); 
     c.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("HELLO"); 
      } 
     }); 
     f.getContentPane().add(c); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

注:

checkBox.setSelected(boolean) 

,並有我的聽衆通知,不能用做:因爲在我的計劃,我想能夠做我不使用動作監聽器行動監聽器。那麼有沒有辦法來禁用這個「鼠標懸停」事件或另一種方式我可以實現我的聽衆?

+0

奇怪,我以爲使用'setSelected'會觸發更改監聽器。我一定在想別的東西。 – jeef3 2009-08-19 21:32:34

+0

如果我在Mac OSX上運行Java 5,我不會將鼠標懸停在事件上。 – banjollity 2009-08-19 21:48:05

+0

@ jeef3:setSelected DOES觸發器更改事件。這就是我使用它的原因。事情是,變化事件也得到鼠標在動作引發:) – 2009-08-19 22:05:31

回答

28

由於獲得/失去的焦點代表組件狀態的變化,因此您可以在鼠標上獲取事件。

相反,你可以使用ItemListener,它會給你ItemEvents。

實現ItemListener接口的對象在事件發生時獲取此ItemEvent。聆聽者無需處理單個鼠標移動和鼠標點擊的細節,而是可以處理「有意義」(語義)事件,如「選擇項目」或「取消選擇項目」。

您可以使用AbstractButton類中的addItemListener()方法將其添加到您的複選框中。只是這種替換addChangeListener:

c.addItemListener(new ItemListener() { 

    public void itemStateChanged(ItemEvent e) { 
     System.err.println(e.getStateChange()); 
    } 
}); 
+0

感謝這個作品。我總是通過項目監聽器來應用,只列出組件。 :) – 2009-08-19 22:04:29

+1

沒問題。它實際上是用於列表的ListSelectionListener。列表和按鈕有不同的界面,因爲列表選擇需要支持選擇需要不同事件類型的一系列單元格。 – Aaron 2009-08-19 22:23:25

1

複選框的狀態(即使只是複選框模型)根據是否有鼠標懸停而改變。因此應該預期一個狀態變化事件。

因此,請回頭看看複選框處於什麼狀態並相應更新。最好直接去模型,而不是使用「臃腫」的組件接口。

6

使用c.setRolloverEnabled(false)`,你不會得到鼠標移動的任何事件。