好的,我的问题是拖动鼠标时mouseMoved被冻结,这是MouseMotionListener中的方法之一(mouseMoved和mouseDragged)。我认为,也许mouseDragged正在冻结mouseMoved,如果有人可以帮助我,使它不这样做,那将是非常美妙的。
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.Rectangle;
import java.lang.Runnable;
import java.awt.RenderingHints;
import java.awt.Graphics2D;
import java.awt.Color;
public class Window extends JFrame implements MouseMotionListener, Runnable {
protected static int xWindow = 640;
protected static int yWindow = 480;
private Image dbi;
private Graphics dbg;
private int xMouse;
private int yMouse;
public void paint( Graphics g ) {
dbi = createImage( getWidth(), getHeight() );
dbg = dbi.getGraphics();
paintComponent( dbg );
g.drawImage( dbi, 0, 0, this );
}
public void paintComponent( Graphics g ) {
Graphics2D g2d = ( Graphics2D ) g;
g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON );
g2d.setColor( Color.RED );
g2d.drawString( "Mouse X: " + xMouse + " | Y: " + yMouse, 15, 40 );
repaint();
}
public void mouseDragged( MouseEvent e ) {
e.consume();
}
public void mouseMoved( MouseEvent e ) {
xMouse = e.getX();
yMouse = e.getY();
e.consume();
}
public void run() {
while ( true ) {
try {
Thread.sleep( 1 );
} catch( Exception e ) {
e.printStackTrace();
}
}
}
}
最佳答案
您正在从repaint
调用paintComponent
,这将导致以下方法调用链无限期重复:
paint -> (manual call to) paintComponent
要利用Swing的优化绘制模型,最好不要在顶级容器(例如
JFrame
)中进行自定义绘制。将所有绘画功能提取到新的基于JComponent
或JPanel
的类,并覆盖paintComponent
。 Swing将在paintComponent
上调用repaint
,因此无需直接调用。不要忘记拨打super.paintComponent(g)
。从
repaint
内调用mouseMoved
。也不要调用
Thread.sleep
,这会阻止EDT
并导致UI冻结。 Swing提供了自己的concurrency objects,例如Swing Timers。