普通 JCheckbox 直接对用户输入做出反应并设置或取消设置刻度。在此之后调用 MouseListener。我想要实现的是 JCheckbox 的状态只能由控制器更改。什么是体面的方式来实现这一目标?
我尝试添加一个鼠标侦听器,它会立即再次添加/删除刻度,但这会导致闪烁。
我发现的唯一方法是覆盖 processMouseEvent 方法,但这真的很糟糕......
编辑(我当前的版本):这现在可以工作了。之前错过了调整模型。
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EventListener;
import javax.swing.JCheckBox;
public class MyJCheckBox extends JCheckBox {
public MyJCheckBox() {
MouseListener[] ml = (MouseListener[]) this.getListeners(MouseListener.class);
for (int i = 0; i < ml.length; i++) {
this.removeMouseListener(ml[i]);
this.addMouseListener(new MouseListenerWrapper(ml[i]));
}
}
public void addClickListener(ClickListener listener) {
listenerList.add(ClickListener.class, listener);
}
private class MouseListenerWrapper implements MouseListener {
MouseListener listener;
public MouseListenerWrapper(MouseListener listener) {
this.listener = listener;
}
@Override
public void mouseClicked(MouseEvent e) {
listener.mouseClicked(e);
}
@Override
public void mousePressed(MouseEvent e) {
listener.mousePressed(e);
}
@Override
public void mouseReleased(MouseEvent e) {
for(ClickListener listener : listenerList.getListeners(ClickListener.class)) {
listener.onClick();
//Adjust model
MyJCheckBox.this.getModel().setArmed(false);
MyJCheckBox.this.getModel().setPressed(false);
}
}
@Override
public void mouseEntered(MouseEvent e) {
listener.mouseEntered(e);
}
@Override
public void mouseExited(MouseEvent e) {
listener.mouseExited(e);
}
}
}
interface ClickListener extends EventListener {
public void onClick();
}