【发布时间】:2014-07-18 23:34:45
【问题描述】:
我正在尝试自学 Java,但我被难住了。我要么今天练习太多,要么我只是有一个愚蠢的时刻。
我正在使用绘画和 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
}
}
【问题讨论】:
-
你将(在许多情况下,比如你的)有一个循环引用:框架将“知道”监听器实例,并且监听器实例可能有一个引用返回到框架。但是,在任何情况下:NOT 在组件上调用
getGraphics()!以这种方式绘画显然是错误。例如,请参阅docs.oracle.com/javase/tutorial/uiswing/painting 了解简介。 -
看看Performing Custom Painting看看应该怎么画……
-
感谢两位提供的资源。正是我需要阅读的内容。
标签: java class paint circular-reference