簡體   English   中英

javax.swing.JCheckBox setSelected不是從GUI調用

[英]javax.swing.JCheckBox setSelected is not calling from GUI

我正在嘗試擴展一些Swing組件並覆蓋與其狀態(JComboBox的setSelectedIndex,JCheckBox的setSelected等)交互的方法。 JCheckBox存在問題。 我已經重寫了setSelected方法,但是當用戶通過UI更改JCheckBox狀態時,它似乎不會調用。 我可以通過調用方法來更改JCheckBox狀態,但似乎GUI使用另一種方式來更改其狀態。 我怎樣才能在班上趕上那個事件? 對於其他類的Swing,一切都很好,並且所有重寫的方法都可以正常工作。

public class MyCheckBox extends JCheckBox {
    @Override
    public void setSelected(boolean selected) {
        //Method is not performed when MyCheckBox is clicked
        super.setSelected(selected);
    }
}

上。:我已經制作了支持“撤消/重做”動作的組件包。 我剛剛向所有組件添加了addUndoableEditListener(UndoableEditListener l)方法,因此實現隱藏在組件內部。 這就是為什么我擴展了Swing組件而不是使用動作偵聽器的原因。

如果您只是想聽聽此更改,請使用ItemListener(它甚至會監聽ButtonGroup更改或setSelected方法調用所產生的事件):

checkBox.addItemListener ( new ItemListener ()
{
    public void itemStateChanged ( ItemEvent e )
    {
        System.out.println (isSelected ());
    }
} );

如果只想從“ UI”接收更改,則添加一個ActionListener。

但是,如果您真的想知道復選框如何從“ UI”更改狀態...

JCheckBox只是一個簡單的按鈕,每個狀態都有適當的圖標,因此我們應該看到JButton事件

在JButton類中沒有關於監聽鼠標的任何內容-它隱藏在當前ButtonUI的內部

在BasicButtonUI類中,您可以找到添加到它的偵聽器:

protected void installListeners(AbstractButton b) {
    BasicButtonListener listener = createButtonListener(b);
    if(listener != null) {
        b.addMouseListener(listener);
        b.addMouseMotionListener(listener);
        b.addFocusListener(listener);
        b.addPropertyChangeListener(listener);
        b.addChangeListener(listener);
    }
}

在釋放鼠標的BasicButtonListener中:

public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
    // Support for multiClickThreshhold
        if (shouldDiscardRelease) {
        shouldDiscardRelease = false;
        return;
    }
    AbstractButton b = (AbstractButton) e.getSource();
    ButtonModel model = b.getModel();
    model.setPressed(false);
    model.setArmed(false);
    }
}

因此,該事件將發送到按鈕內部的ButtonModel中。 要捕獲它,您必須將button / check內部的ButtonModel替換為您自己的按鈕:

check.setModel ( new DefaultButtonModel ()
{
    public void setSelected ( boolean b )
    {
        super.setSelected ( b );
    }
} );

您需要 ActionListener 添加到復選框。

盡管所有注釋都是相關的,並且可能不需要擴展這些組件,但是我進行了快速測試,以確定單擊按鈕時遵循的代碼路徑(出於好奇)。 以下代碼

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import java.awt.EventQueue;

public class JCheckBoxTest {

  private static JCheckBox createCheckBox(){
    JCheckBox checkBox = new JCheckBox();
    checkBox.setModel( new JToggleButton.ToggleButtonModel(){
      @Override
      public void setSelected( boolean b ) {
        Thread.dumpStack();
        super.setSelected( b );
      }
    });
    return checkBox;
  }

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        JFrame testFrame = new JFrame( "TestFrame" );
        testFrame.add( createCheckBox() );
        testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        testFrame.pack();
        testFrame.setVisible( true );
      }
    } );
  }
}

當按鈕后面的模型的選定狀態更改時,允許確定堆棧跟蹤。 stacktrace顯示以下相關部分

at JCheckBoxTest$1.setSelected(JCheckBoxTest.java:19)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:289)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)

因此,基本上聽者直接與按鈕模型進行交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM