我正在尝试扩展一些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);
}
}
UP .: 我已经让它拥有支持“撤消/重做”操作的组件包。我刚刚将addUndoableEditListener(UndoableEditListener l)方法添加到所有组件中,因此实现隐藏在我的组件中。这就是我扩展Swing组件而不是使用动作侦听器的原因。
答案 0 :(得分:2)
如果你想简单地听这个改变 - 使用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集。要捕获它,您必须将按钮/ check内的ButtonModel替换为您自己的ButtonModel:
check.setModel ( new DefaultButtonModel ()
{
public void setSelected ( boolean b )
{
super.setSelected ( b );
}
} );
答案 1 :(得分:1)
您需要add ActionListener
复选框。
答案 2 :(得分:1)
虽然所有注释都是相关的,并且可能不需要扩展这些组件,但我做了一个快速测试,以确定单击按钮时出现的代码路径(仅仅是出于好奇)。以下代码
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 );
}
} );
}
}
允许在更改按钮后面的模型的选定状态时确定堆栈跟踪。堆栈跟踪显示以下相关部分
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)
基本上,监听器直接与按钮模型交互。