通常の JCheckbox は、ユーザー入力に直接反応し、目盛りを設定または設定解除します。この後、MouseListener が呼び出されます。私が達成したいのは、JCheckbox の状態はコントローラーによってのみ変更できるということです。これを達成するためのまともな方法は何ですか?
目盛りをすぐに追加/削除するマウスリスナーを追加しようとしましたが、これによりちらつきが発生します。
私が見つけた唯一の方法は、 processMouseEvent メソッドを上書きすることでしたが、これは本当に悪いです...
EDIT(私の現在のバージョン):これは今すぐ動作します。前にモデルを調整するのを逃しました。
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();
}