gpt4 book ai didi

java - 事件监听器卡住 (Java)

转载 作者:行者123 更新时间:2023-11-30 04:27:15 25 4
gpt4 key购买 nike

好吧,我的问题是当您拖动鼠标时,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();
}
}
}

}

最佳答案

您正在从 paintComponent 调用 repaint,这会导致以下方法调用链无限重复:

paint -> (manual call to) paintComponent 

要利用 Swing 的优化绘制模型,最好不要在 JFrame 等顶级容器中进行自定义绘制。将所有绘制功能提取到新的基于 JComponentJPanel 的类并覆盖 paintComponent。 Swing 将在 repaint 上调用 paintComponent,因此无需直接调用。不要忘记调用 super.paintComponent(g)

mouseMoved 中调用 repaint

也不要调用 Thread.sleep,这会阻塞 EDT 并导致 UI 卡住。 Swing提供了自己的concurrency objectsSwing Timers .

关于java - 事件监听器卡住 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15562740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com