Java-为什么鼠标移动会导致帧更新?

Java-为什么鼠标移动会导致帧更新?,java,swing,Java,Swing,所以,在忙乱了一个小时试图弄明白为什么我的JPanel在移动鼠标时会闪烁之后,我发现根本不是这样。从我发现的情况来看,从改变im绘制图像的顺序来看,缓冲区图像是在绘制到它之前绘制的。我只能假设移动鼠标会导致在渲染周期结束之前绘制图像。Im将所有内容绘制到一个单独的图像,覆盖JPanels paintComponent方法,然后让JFrame绘制面板。移动帧或调整其大小会导致相同的事情,但我并不担心这些 public void render() { Graphics g = screen.

所以,在忙乱了一个小时试图弄明白为什么我的JPanel在移动鼠标时会闪烁之后,我发现根本不是这样。从我发现的情况来看,从改变im绘制图像的顺序来看,缓冲区图像是在绘制到它之前绘制的。我只能假设移动鼠标会导致在渲染周期结束之前绘制图像。Im将所有内容绘制到一个单独的图像,覆盖JPanels paintComponent方法,然后让JFrame绘制面板。移动帧或调整其大小会导致相同的事情,但我并不担心这些

public void render() {
    Graphics g = screen.getGraphics();

    // State based system, renders all subsequent images
    Manager.render(g);

    // For fading between state changes
    g.setColor(new Color(0, 0, 0, Variables.alpha));
    g.fillRect(0, 0, Variables.frame.getWidth(), Variables.frame.getHeight());

    // Only way that worked to get the frame to update the JPanel
    Variables.frame.repaint();
}

public static void generateFrame(String title, int width, int height, boolean resize, KeyListener keys,
        MouseListener mouse, MouseMotionListener mMotion, MouseWheelListener mWheel) {

    frame = new JFrame(title);

    frame.setResizable(resize);
    frame.addKeyListener(keys);
    frame.addMouseListener(mouse);
    frame.addMouseMotionListener(mMotion);
    frame.addMouseWheelListener(mWheel);    
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            shutdown();
        }
    });

    pane = new JPanel() {
        private static final long serialVersionUID = -7796800583217917918L;

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(Variables.screen, -Variables.xOffset, -Variables.yOffset,
                    Variables.frame.getWidth() + Variables.yOffset * 2,
                    Variables.frame.getHeight() + Variables.xOffset * 2, null);
        }

    };
    frame.add(Variables.pane);
    frame.pack();
    frame.setSize(width, height);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true); 

}

因为,这就是鼠标移动所做的,它可能需要用户界面的某些部分进行更新以响应它的传递——而不需要更多的上下文——我会担心
Graphics g=screen.getGraphics()
Manager.render(g)但我不知道它们连接到什么-记住,Swing使用一个被动渲染引擎,这意味着绘画可能在任何时候出于任何原因出现,所以看起来像是在不同的线程上绘制?您无法预测重绘何时发生-可能有很多原因。对线程来说,唯一正确的方法是使用双缓冲(您对一个BuffereImage绘制更新,但在屏幕上显示另一个BuffereImage,完成后交换它们)。使变量(
screen
)引用缓冲区映像
volatile
,或始终更新和读取
screen
变量,同时
在一个对象上同步
)我们可以运行的Post代码。。为了更快地获得更好的帮助,我发布了一个or。我只是在面板和原始缓冲区之间为整个帧添加了另一个缓冲区。