Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.swing.JCheckBox setSelected未从GUI调用_Java_Swing_Overriding_Jcheckbox - Fatal编程技术网

javax.swing.JCheckBox setSelected未从GUI调用

javax.swing.JCheckBox setSelected未从GUI调用,java,swing,overriding,jcheckbox,Java,Swing,Overriding,Jcheckbox,我试图扩展一些Swing组件,并重写与状态交互的方法(JComboBox的setSelectedIndex、JCheckBox的setSelectedIndex等)。 JCheckBox有问题。我已经重写了setSelected方法,但当用户通过UI更改JCheckBox状态时,它似乎不会调用。我可以通过调用方法来更改JCheckBox状态,但GUI似乎使用了另一种方法来更改其状态。我怎样才能在班上赶上那个事件? 对于其他Swing类,一切正常,所有重写的方法都正常工作 public class

我试图扩展一些Swing组件,并重写与状态交互的方法(JComboBox的setSelectedIndex、JCheckBox的setSelectedIndex等)。 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(它甚至会侦听通过按钮组更改或setSelected方法调用进行的事件):

如果您只想从“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集。要捕获它,您必须将按钮内的ButtonModel/检查替换为您自己的:

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

如果只想侦听此更改,请使用ItemListener(它甚至会侦听ButtonGroup更改或setSelected方法调用所生成的事件):

如果您只想从“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集。要捕获它,您必须将按钮内的ButtonModel/检查替换为您自己的:

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

尽管所有注释都是相关的,并且可能不需要扩展这些组件,但我做了一个快速测试,以确定当您单击按钮时遵循的代码路径(只是出于好奇)。下面的代码

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。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)

因此,监听器基本上直接与按钮模型进行交互。

尽管所有注释都是相关的,并且可能不需要扩展这些组件,但我做了一个快速测试,以确定单击按钮时遵循的代码路径(只是出于好奇)。下面的代码

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。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)

因此,监听器基本上直接与按钮模型进行交互。

我的第一个问题:为什么要扩展这些组件而不是简单地使用它们?为什么假设GUI调用这个方法来设置值?如果您想在进行更改时启动一个操作,您应该使用适当的侦听器。我自己会扩展添加到JCheckBox的AbstractAction。关于您的“UP”:我认为这是一个不好的理由。如果要扩展附加到组件的操作,请不要扩展视图或组件本身,因为您的目标与显示组件无关。简而言之:不要扩展组件;这是错误的。我的第一个问题:为什么您要扩展这些组件而不是简单地使用它们?为什么您要假设GUI恰好调用这个方法来设置值?如果您想在进行更改时启动一个操作,您应该使用适当的侦听器。我自己会扩展添加到JCheckBox的AbstractAction。关于您的“UP”:我认为这是一个不好的理由。如果要扩展附加到组件的操作,请不要扩展视图或组件本身,因为您的目标与显示组件无关。简而言之:不要扩展组件;这是错误的。请记住,每个Swing组件都有自己的UI类,并且可能存在一些/all/none操作/鼠标/键侦听器。这只取决于组件的种类以及Swing开发人员创建组件的方式。无论如何,如果您将JDK源代码附加到IDE并在需要时查看它们,就很容易找到任何关于它的信息。请记住,每个Swing组件都有自己的UI类和一些/all/none操作/鼠标/键侦听器可能在那里。这只取决于组件的种类以及Swing开发人员创建组件的方式。无论如何,如果您将JDK源代码附加到IDE中,并在需要时查看它们,那么就很容易找到关于它的任何信息。