【发布时间】:2015-08-30 10:23:00
【问题描述】:
我正在尝试在不使用 JComponents 的情况下制作一个简单的 GUI 程序。 目前,我有一个 BufferedImage 绘制到屏幕外,这样它就不会闪烁(或者我认为是这样)。
我在这里制作了一个新程序来复制这个问题:
package Main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Main {
private final static JFrame frame = new JFrame();
private final static Panel panel = new Panel();
public static void main(String[] args) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setPreferredSize(new Dimension(1000, 750));
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
while (true) {
panel.setBackgroundColour(Color.WHITE);
panel.setBackgroundColour(Color.BLACK);
panel.repaint();
}
}
private static class Panel extends JPanel {
private final BufferedImage offScreen = new BufferedImage(1000, 750, BufferedImage.TYPE_INT_ARGB);
private final Graphics graphics = offScreen.getGraphics();
@Override
protected void paintComponent(Graphics graphics) {
graphics.drawImage(offScreen, 0, 0, null);
}
public void setBackgroundColour(Color colour) {
graphics.setColor(colour);
graphics.fillRect(0, 0, 1000, 750);
}
}
}
在上面的示例中,我让屏幕变黑,然后变白(离屏)。 我期望的是paintComponent() 只显示白屏。 相反,也会显示黑屏,但一切都在闪烁。
我只是错误地使用了 Graphics2D,还是应该只使用 BufferStrategy 来满足我的双缓冲需求?
【问题讨论】:
-
在进行任何自定义绘画之前请致电
super.paintComponent -
你的 while 循环有点疯狂
-
我在 (true) 时做到了,这里仅作为示例。在我的实际程序中,情况并非如此。 :p 不过我会试试的。
-
您可能还存在线程竞争情况,因为面板正在“尝试”绘制图像,您正在更新它...
-
刚刚尝试调用 super.paintComponent,但并没有改变任何东西。不过我猜我会把它留在那里。
标签: java swing double buffer flicker