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