Java 如何禁用鼠标单击按钮操作事件?

Java 如何禁用鼠标单击按钮操作事件?,java,swing,mouseevent,jbutton,Java,Swing,Mouseevent,Jbutton,有没有办法禁用鼠标单击?在面板中有不同的组件,对于一些按钮单击事件,我想禁用鼠标单击。我的意思是鼠标的点击对组件没有任何影响。我可以使用setEnabled()函数禁用,但我不想这样做 有什么方法可以禁用鼠标单击 情况: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { //..disable the mouse click on each component present insid

有没有办法禁用鼠标单击?在面板中有不同的组件,对于一些按钮单击事件,我想禁用鼠标单击。我的意思是鼠标的点击对组件没有任何影响。我可以使用
setEnabled()
函数禁用,但我不想这样做

有什么方法可以禁用鼠标单击

情况:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {  
       //..disable the mouse click on each component present inside the panel
}

添加空的鼠标侦听器。这将“禁用”单击,因为它不会产生任何效果

您可以向所有按钮添加扩展ActionListener,如下所示:

public abstract class ExtendedActionListener implements ActionListener{

    private static boolean disabled = false;

    public static void setDisabled(boolean disabled){
        ExtendedActionListener.disabled  = disabled;
    }

    @Override
    public final void actionPerformed(ActionEvent e){

        if(disabled)
            return;

        doSomething;

    }
}
public class SingleSelectionButtonGroup {

    private final List<JButton> buttons;

    public static SingleSelectionButtonGroup group(List<JButton> buttons) {
        return new SingleSelectionButtonGroup(buttons);
    }

    public static SingleSelectionButtonGroup group(JButton...buttons) {
        return new SingleSelectionButtonGroup(Arrays.asList(buttons));
    }

    private SingleSelectionButtonGroup(List<JButton> buttons) {
        this.buttons = new ArrayList<JButton>(buttons);
        setupListener();
    }

    private void setupListener() {
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SingleSelectionButtonGroup.this.disableAllExcept((JButton) e.getSource());
            }
        };

        for (JButton button : buttons) {
            button.addActionListener(listener);
        }
    }

    private void disableAllExcept(JButton clickedButton) {
        for (JButton button : buttons) {
            if (!clickedButton.equals(button)) {
                button.setEnabled(false);
            }
        }
    }

}
现在只需通过调用方法
setDisabled(false)
来禁用所有ActionListener。当你点击按钮时,按钮的视觉行为根本没有改变,但什么也没有发生


如果视觉点击行为无关紧要,那么您可以删除鼠标侦听器。

您可以创建如下按钮组:

public abstract class ExtendedActionListener implements ActionListener{

    private static boolean disabled = false;

    public static void setDisabled(boolean disabled){
        ExtendedActionListener.disabled  = disabled;
    }

    @Override
    public final void actionPerformed(ActionEvent e){

        if(disabled)
            return;

        doSomething;

    }
}
public class SingleSelectionButtonGroup {

    private final List<JButton> buttons;

    public static SingleSelectionButtonGroup group(List<JButton> buttons) {
        return new SingleSelectionButtonGroup(buttons);
    }

    public static SingleSelectionButtonGroup group(JButton...buttons) {
        return new SingleSelectionButtonGroup(Arrays.asList(buttons));
    }

    private SingleSelectionButtonGroup(List<JButton> buttons) {
        this.buttons = new ArrayList<JButton>(buttons);
        setupListener();
    }

    private void setupListener() {
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SingleSelectionButtonGroup.this.disableAllExcept((JButton) e.getSource());
            }
        };

        for (JButton button : buttons) {
            button.addActionListener(listener);
        }
    }

    private void disableAllExcept(JButton clickedButton) {
        for (JButton button : buttons) {
            if (!clickedButton.equals(button)) {
                button.setEnabled(false);
            }
        }
    }

}
公共类SingleSelectionButtonGroup{
私有最终列表按钮;
公共静态SingleSelectionButtonGroup组(列表按钮){
返回新的SingleSelectionButtonGroup(按钮);
}
公共静态SingleSelectionButtonGroup组(JButton…按钮){
返回新的SingleSelectionButtonGroup(Arrays.asList(buttons));
}
私有单选按钮组(列表按钮){
this.buttons=新的ArrayList(按钮);
setupListener();
}
私有void setupListener(){
ActionListener=新建ActionListener(){
已执行的公共无效操作(操作事件e){
SingleSelectionButtonGroup.this.disableAllExcept((JButton)e.getSource());
}
};
用于(JButton按钮:按钮){
addActionListener(listener);
}
}
私有void disableAllExcept(JButton clicked按钮){
用于(JButton按钮:按钮){
如果(!clickedButton.equals(按钮)){
按钮。设置启用(错误);
}
}
}
}
然后将其与要分组的按钮集合一起使用:

public class Application {

    public void run() {
        final JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(400, 300));

        final JPanel pane = new JPanel();

        List<JButton> buttons = new ArrayList<JButton>();
        String[] texts = {"A", "B", "C"};

        for (String text : texts) {
            JButton button = new JButton(text);
            buttons.add(button);
            pane.add(button);
        }

        SingleSelectionButtonGroup.group(buttons);      
        frame.getContentPane().add(pane);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Application().run();
    }

}
公共类应用程序{
公开募捐{
最终JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架设置尺寸(新尺寸(400300));
最终JPanel窗格=新JPanel();
列表按钮=新建ArrayList();
字符串[]文本={“A”、“B”、“C”};
用于(字符串文本:文本){
JButton按钮=新JButton(文本);
按钮。添加(按钮);
窗格。添加(按钮);
}
SingleSelectionButtonGroup.group(按钮组);
frame.getContentPane().add(窗格);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
新建应用程序().run();
}
}

您应该使用侦听器的一个公共类,并使用静态方法打开和关闭侦听器

public abstract class BaseMouseListener implements ActionListener{

private static boolean active = true;
public static void setActive(boolean active){
    BaseMouseListener.active = active;
}

protected abstract void doPerformAction(ActionEvent e);

@Override
public final void actionPerformed(ActionEvent e){
    if(active){
        doPerformAction(e);
    }
}
}

您的侦听器必须实现
doPerformedAction()

按钮是否仍会接收操作事件?我知道他想要一个
ActionListener
,但它不监听鼠标触发的动作。我不明白你的意思。让我们假设有6个按钮,我按下其中一个。当我按下它时,我想禁用鼠标点击每个按钮。添加一个空的鼠标侦听器在这方面有什么帮助?即使我保持鼠标侦听器为空,我仍然可以按其他按钮mm。。。首先,你为什么要添加一个空的监听器?@kleopatra,因为答案是这样说的。@TomášZato答案是完全错误的-添加一个whatevertype的空监听器对已经注册的监听器没有任何影响-所以我想知道它如何/为什么工作;-)您的按钮是否有任何
ActionListener
?你想让用户点击按钮,但什么都没有发生,或者用户不能点击按钮?你想只使用()mouseevents吗?但事件来自键盘(Enter和Tab被实现为加速器)否,这绝对不是你想要的:一个行为良好的用户界面必须同样可以通过键盘和鼠标使用。你的真正目标是什么?@Genzer无法点击button@mKorbel没有这样做的余地(加速器)。用户单击某个按钮后,他应该无法单击任何内容。所有其他按钮都将被禁用。已经有一种类型的ActionListener具有启用的属性:它称为Action:-)