2013-03-22 85 views
1

好吧,我的问题是,当你拖动鼠标时,mouseMoved被冻结,这是MouseMotionListener(mouseMoved和mouseDragged)中的一种方法。我想也许mouseDragged冻结mouseMoved,如果任何人都可以帮助我,所以它不这样做,那将是非常美妙的。EventListener冻结(Java)

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(); 
      } 
     } 
    } 

} 

回答

2

你打电话repaintpaintComponent这会导致下面的方法调用链无限期地重复:

paint -> (manual call to) paintComponent 

采取Swing的优化油漆模式的优势,最好不要做风俗画中的顶级容器如JFrame。将所有绘画功能提取到基于类的新的JComponentJPanel,并覆盖paintComponent。 Swing将拨打paintComponentrepaint,因此无需直接拨打电话。不要忘记拨打super.paintComponent(g)

mouseMoved内呼叫repaint

也不要致电Thread.sleep,这会阻止EDT并导致UI冻结。 Swing提供自己的concurrency objects,如Swing Timers