Java 暂时禁用鼠标侦听器

Java 暂时禁用鼠标侦听器,java,swing,jpanel,Java,Swing,Jpanel,我正在和两个JPanels一起做作业。一个面板包含一个默认移动的球,另一个面板有两个JRadioButtons,分别标记为On和Off。我被卡住的部分是禁用和启用MouseListener(P2.java),允许用户单击面板重新定位球。我已经创建了使用ActionListener(P1.java)触发的函数打开和关闭)。这将启动和停止球。我尝试使用removeActionListener,但是编译器抛出错误,我无法使用该方法 此外,在中使用类似的itemstener会更容易,以便在已选择JRad

我正在和两个
JPanel
s一起做作业。一个面板包含一个默认移动的球,另一个面板有两个
JRadioButton
s,分别标记为
On
Off
。我被卡住的部分是禁用和启用
MouseListener
P2.java
),允许用户单击面板重新定位球。我已经创建了使用
ActionListener
P1.java
)触发的函数
打开
关闭
)。这将启动和停止球。我尝试使用
removeActionListener
,但是编译器抛出错误,我无法使用该方法

此外,在中使用类似的
itemstener
会更容易,以便在已选择
JRadioButton
时忽略它

P1.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class P1 extends JPanel
{
    private JRadioButton on = new JRadioButton("On", true);
    private JRadioButton off = new JRadioButton("Off");

    public P1()
    {
        ButtonGroup group = new ButtonGroup();
        group.add(on);
        group.add(off);

        add(on);
        add(off);

        ButtonHandler bh = new ButtonHandler();
        on.addActionListener(bh);
        off.addActionListener(bh);
    }

    private class ButtonHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            if(ae.getSource() == on) turnOn();

            if(ae.getSource() == off) turnOff();
        }
    }

    public static void turnOn () {
        Ball.dx = 1;
        Ball.dy = 1;
    }

    public static void turnOff () {
        Ball.dx = 0;
        Ball.dy = 0;
    }
}
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class P2 extends JPanel implements MouseListener
{
    public P2()
    {
        super();
        addMouseListener(this);
    }

    public void mousePressed(MouseEvent e)
    {
        ball.x = e.getX();
        ball.y = e.getY();
        repaint();
    }

    ...
}
P2.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class P1 extends JPanel
{
    private JRadioButton on = new JRadioButton("On", true);
    private JRadioButton off = new JRadioButton("Off");

    public P1()
    {
        ButtonGroup group = new ButtonGroup();
        group.add(on);
        group.add(off);

        add(on);
        add(off);

        ButtonHandler bh = new ButtonHandler();
        on.addActionListener(bh);
        off.addActionListener(bh);
    }

    private class ButtonHandler implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            if(ae.getSource() == on) turnOn();

            if(ae.getSource() == off) turnOff();
        }
    }

    public static void turnOn () {
        Ball.dx = 1;
        Ball.dy = 1;
    }

    public static void turnOff () {
        Ball.dx = 0;
        Ball.dy = 0;
    }
}
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class P2 extends JPanel implements MouseListener
{
    public P2()
    {
        super();
        addMouseListener(this);
    }

    public void mousePressed(MouseEvent e)
    {
        ball.x = e.getX();
        ball.y = e.getY();
        repaint();
    }

    ...
}
项目的其余部分


    • 如果不查看您的代码,我只需要让我的鼠标侦听器的行为取决于它的状态。我会给它一个状态布尔变量,比如说enabled,包含getter和setter,如果enabled为false,则短路代码。i、 例如,具体方法可能类似于:

      public void mousePressed(MouseEvent mEvt) {
        if (!enabled) {
          return;
        }
        // rest of mousePressed goes here
      }
      
      另一个建议是,不要这样做:

      public class P2 extends JPanel implements MouseListener {
      

      不要让你的GUI类实现你的监听器接口,因为你要求类做的太多了。这对于玩具程序或非常小的演示程序来说是可以的,但是对于较大的项目,您需要将您的逻辑从视图中分离出来,从控制中分离出来。

      您也可以使用玻璃窗格来阻止用户交互


      例如:

      请不要发布代码链接。请记住,我们是志愿者,如果代码太大而无法在此处发布,则要求志愿者通过的代码可能太大。同时,你也希望让别人尽可能容易地帮助你。相反,在这里发布代码本身,最好是将代码浓缩到只允许它编译和运行并显示您的问题所必需的内容,一个示例。是的,这需要你付出相当多的努力,但这将是帮助我们帮助你的努力,不会白费。@HovercraftFullOfEels谢谢你的建议。希望编辑有帮助。我将等待您的努力,在创建一个之前,通过您的代码。同时,我将提供一个一般性的建议。我只是猜测,但网站链接代码的使用往往会受到反对。如果您具有停止/启动球的功能,为什么不升起一个标志,向侦听器指示它应该忽略鼠标事件,或者简单地删除鼠标侦听器…@MadProgrammer,可能用于
      java
      标记。如果需要,我的标签通常鼓励链接代码;这花了我一段时间。我理解SSCCE的想法,但我的努力似乎是徒劳的。我试图编辑与我的问题相关的内容。我也喜欢你的建议。答案很好,但我不同意“没有GUI类实现侦听器接口”。对我来说,GUI组件似乎是处理GUI事件(如鼠标侦听器)的最佳位置。然而,处理代码应该只是处理处理程序的GUI逻辑的几行代码,然后委托给处理事件的业务逻辑的业务方法/事件侦听器。