java - JCheckbox 仅通过 Controller 更改其状态

标签 java swing mouselistener jcheckbox passive-view

普通 JCheckbox 直接对用户输入使用react并设置或取消设置勾号。此后,将调用 MouseListener。我想要实现的是 JCheckbox 的状态只能由 Controller 更改。有什么好的方法可以实现这一目标?

我尝试添加一个鼠标监听器,它会立即再次添加/删除勾号,但这会导致闪烁。

我发现的唯一方法是覆盖 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();
}

最佳答案

我不喜欢人们玩弄用户界面。这会让用户感到困惑,如果他们无法单击该复选框,他们会认为应用程序已损坏。

无论如何,从复选框中删除 MouseListener。

MouseListener[] ml = (MouseListener[])checkBox.getListeners(MouseListener.class);

for (int i = 0; i < ml.length; i++)
    checkBox.removeMouseListener( ml[i] );

关于java - JCheckbox 仅通过 Controller 更改其状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20553308/

相关文章:

java - JFrame背景图像设置背景图像时,其他按钮不会出现在框架上?

java - 在单个 Jpanel 上创建鼠标监听器

java - MouseListener 类从未被调用?

java - 仅在一个方向上监听鼠标运动

Java:URL 还是字符串?

Java读卡器乱码

java - 在 Java 中有一种方法可以定义 char 类型的枚举

Java Swing JPanel 向上滑动动画?

java - 任务的分钟长轮询或单个调度程序 - 通知系统的方法

Java 使用 HashMap 和 switch 语句