有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当用鼠标绘制要移动的对象时,java会延迟

我在鼠标位置绘制矩形时遇到一些问题。移动鼠标时,绘制的矩形滞后于鼠标光标。有没有办法确保矩形在鼠标上准确移动且不落后

这里有一个小例子,虽然因为这只是一个矩形,滞后很小,但它确实存在。在更大的程序中,我一次画一吨,虽然只移动一个

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.*;

public class MouseTest {
    JFrame window;
    DrawPanel content;

    public MouseTest(){
        window = new JFrame("Test");
        content = new DrawPanel();
        window.setContentPane(content);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        window.pack();
    }

    public static void main (String[] args){
        MouseTest test = new MouseTest();
    }

    private class DrawPanel extends JPanel implements MouseMotionListener {
        int mouseX;
        int mouseY;

        private DrawPanel(){
            setBackground(Color.BLUE);
            setPreferredSize(new Dimension(400,400));
            addMouseMotionListener(this);
        }

        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(mouseX, mouseY, 20, 20);
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseMoved(MouseEvent e) {
            mouseX = e.getX();
            mouseY = e.getY();
            repaint();

        }
    }

}

共 (4) 个答案

  1. # 1 楼答案

    t首先要做的是将所有Swing/AWT代码移到EDT中。在你的应用程序中,这可能无关紧要,但这是一个好习惯

    然而,我无法用这两种方法重现你的滞后

    public static void main (String[] args)
    {
        SwingUtilities.invokeLater(
            new Runnable()
            {
                public void run()
                {
                    MouseTest test = new MouseTest();
                }
            });
    }
    

    有关Swing线程的更多信息,请参见this article

  2. # 2 楼答案

    即使这是更多的工作,我建议任何这样的任务,你只无效,并重新油漆的地区已经改变。这将节省许多周期(想象一下一直绘制完整的背景…)

    你会看到很大的进步

    编辑

    我用这个例子自己测试了它

        public void mouseMoved(MouseEvent e) {
            repaint(mouseX, mouseY, 20, 20);
            mouseX = e.getX();
            mouseY = e.getY();
            repaint(mouseX, mouseY, 20, 20);
        }
    

    而且必须承认这些改进有点学术性(至少对我的电脑而言)。无论如何,这种技术应该用于更复杂的绘画方法。。(您最终将看到改进)

    编辑

    还有更多的欺骗:如果你仍然不喜欢光标所在位置与系统所想之间的不匹配,请尝试关闭光标(http://www.java2s.com/Code/Java/2D-Graphics-GUI/HidethemousecursoruseatransparentGIFasthecursor.htm)为用户提供更好的反馈

  3. # 3 楼答案

    也许有点离题,但当你说“落后”时,你的意思是光标不在矩形的中心吗?您的代码将光标指向矩形的左上角,您需要将其偏移以使其居中

  4. # 4 楼答案

    矩形会滞后,因为类会处理每个运动事件。如果它只处理最近的事件,那么矩形将是最新的(尽管它的位置可能有较大的跳跃)。一种方法是运行一个单独的线程,根据当前鼠标位置绘制矩形,该位置由mouseMoved()方法更新。您必须同步对鼠标位置变量的访问