我试图自学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
}

}

最佳答案

开始将您的逻辑划分为责任领域...

你需要:


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


让我们从模型开始...

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

该视图负责呈现模型的状态并侦听模型状态的更改,以便它可以在模型更改时自动更新。

MouseMotionListener(在这种情况下)将用于修改模型的状态...

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

有关更多详细信息,请参见model-view-controller

同样,Swing中的自定义绘制通常是通过覆盖从paintComponent扩展的类的JComponent方法来完成的。您应该避免覆盖诸如paint之类的顶级容器的JFrame或使用getGraphics。查看Performing Custom Painting了解更多详细信息

关于java - 如何将MotionListener分离到另一个类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24835222/

10-10 14:28