3

我正在与两个JPanels 一起工作。一个面板包含一个默认移动的移动球,另一个面板有两个JRadioButton标记为On和的 s Off。我坚持的部分是禁用和启用允许用户单击面板以重新定位球的MouseListener( )。P2.java我创建了函数turnOnturnOff使用ActionListener( P1.java) 触发。这开始和停止球。我尝试使用removeActionListener,但是编译器会抛出我无法使用该方法的错误。

此外,在这个例子ItemListener中使用like会更容易,这样当已经选择它时它会被忽略?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;
    }
}

P2.java

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();
    }

    ...
}

项目的其余部分

4

2 回答 2

6

如果不查看您的代码,我只会让 MouseListener 的行为取决于它的状态。我会给它一个状态布尔变量,比如说启用,包含 getter 和 setter,然后在启用为 false 时短路代码。即,具体方法可能类似于:

public void mousePressed(MouseEvent mEvt) {
  if (!enabled) {
    return;
  }
  // rest of mousePressed goes here
}

另一个建议,不要这样做:

public class P2 extends JPanel implements MouseListener {

不要让您的 GUI 类实现您的侦听器接口,因为您要求该类做太多事情。这对于玩具程序或非常小的演示程序是可以的,但对于较大的项目,您将希望将您的逻辑与您的视图与您的控制分开。

于 2013-02-05T03:06:34.670 回答
1

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

例如:阻止事件

于 2013-02-05T04:12:53.713 回答