正常JCheckbox直接對用戶輸入做出反應並設置或取消設置滴答。在此之後,MouseListener被調用。我想實現的是JCheckbox的狀態只能由控制器更改。什麼是體面的方式來實現這一目標?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();
}
之後,調用MouseListener。 ==請原因,在哪裏,什麼,以便更快地發佈SSCCE,簡短,可運行,可編譯,只需一個帶有MouseListener的JCheckBox – mKorbel
setSelected。 ..... – mKorbel
我想要這個的原因是有一個被動的觀點,只能通過控制器改變他的狀態。 –