我如何将MotionListener分离到另一个类?

时间:2014-07-18 23:34:46

标签: java class paint circular-reference

我正在努力教自己java,我已经难倒了。我今天要么练得太多,要么就是愚蠢的时刻。

我正在玩paint和MouseMotionListener,以便能够在屏幕上拖动图形,我想将MouseMotionListener作为一个单独的类。

关于问题:

如何将我的代码中的侦听器分成单独的类?当我试图把它放在另一个班级时,我最后做了一个循环引用。

代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;


@SuppressWarnings("serial")
class Class1 extends JFrame implements MouseMotionListener{

Point p,p2;


public Class1(){
    p = new Point(0,0);
    this.setSize(500,500);
    //this.setUndecorated(true);
    //this.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.01f));
    this.addMouseMotionListener(this);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[]args){
    new Class1();
}

public void paint(Graphics g){
    g.setColor(Color.gray);
    g.fillRect(0, 0, 500, 500);
}

public void paintSquare(Graphics g){
    g.fillRect(p.x, p.y, 50, 50);
}

public void paintCover(Graphics g){
    g.setColor(Color.gray);
    g.fillRect(p2.x, p2.y, 50, 50);
}

@Override
public void mouseDragged(MouseEvent e) {
    p2=p;
    p=e.getPoint();
    p.translate(-25, -25);
    paintCover(this.getGraphics());
    paintSquare(this.getGraphics());
}

@Override
public void mouseMoved(MouseEvent e) {
    //do nothing
}

}

2 个答案:

答案 0 :(得分:2)

开始将你的逻辑分成责任范围......

你需要:

  • 渲染输出的东西
  • 维持输出当前状态的东西
  • 要改变输出当前状态的东西

让我们从模型开始......

该模型维护有关输出当前状态的信息,它提供了一种可以更改状态的方法,并且可以生成通知以告知感兴趣的状态状态已更改。

视图负责呈现模型的状态并侦听模型状态的更改,以便在模型更改时自行更新...

MouseMotionListener(在本例中)将用于修改模型的状态......

视图和MouseMotionListener都有对模型的引用,这样,模型将充当各个组件之间的桥梁。 MouseMotionListener将用于更新模型,模型将触发视图通知,这将绘制模型的当前状态。

请查看model-view-controller了解详情。

此外,Swing中的自定义绘制通常通过覆盖从paintComponent扩展的类的JComponent方法来完成。您应该避免覆盖paintJFramegetGraphics等顶级容器。请查看Performing Custom Painting了解更多详情

答案 1 :(得分:0)

MouseMotionListener是一个界面,请参阅here。唯一可以有效"删除"来自Class1实现的是将它移动到abstract类,请参阅here或创建一些处理所需逻辑的对象。

您可以拥有一个抽象类实现MouseMotionListener并覆盖MouseMotionListener中定义的必需方法,并处理所述抽象类中的逻辑。然后你会用你的抽象类extend你的Class1。

请注意,您没有 使其成为抽象类。您也可以使用某种MouseMotionHandler类来执行相同操作,然后创建它并将其添加到JFrame中,如下所示:

public class MouseMotionHandler implements MouseMotionListener {
    @Override
    public void mouseDragged(MouseEvent e) {
       // do something here
    }

    @Override
    public void mouseMoved(MouseEvent e) {
       //do something here
    }
}

JFrame

MouseMotionHandler mmh = new MouseMotionHandler();
this.addMouseMotionListener(mmh);

你可以看一下MouseAdapterhttp://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseAdapter.html

以下是一些参考资料:

http://docs.oracle.com/javase/tutorial/java/concepts/interface.html http://www.javaworld.com/article/2077421/learn-java/abstract-classes-vs-interfaces.html http://www.tutorialspoint.com/java/java_object_classes.htm http://docs.oracle.com/javase/tutorial/java/javaOO/