Java Can';不要停止在JPanel上闪烁

Java Can';不要停止在JPanel上闪烁,java,swing,jpanel,flicker,drawimage,Java,Swing,Jpanel,Flicker,Drawimage,我有一个创建新线程的类 ` 公共屏幕(JPanel Panler) { Panel=panler; RenderImage=新的BuffereImage(1,1,BuffereImage.TYPE_INT_RGB); FPS=25; 隐藏=假; (新线程() { 公开募捐 { while(true) { if(Hide==false) { 定时器=System.currentTimeMillis()+(1000/FPS); 如果(!DrawRendering) { Graphics g=P

我有一个创建新线程的类

`

公共屏幕(JPanel Panler)
{
Panel=panler;
RenderImage=新的BuffereImage(1,1,BuffereImage.TYPE_INT_RGB);
FPS=25;
隐藏=假;
(新线程()
{
公开募捐
{   
while(true)
{
if(Hide==false)
{
定时器=System.currentTimeMillis()+(1000/FPS);
如果(!DrawRendering)
{
Graphics g=Panel.getGraphics();
g、 drawImage(渲染图像,0,0,空);
}
DrawRendering=false;

while(System.currentTimeMillis()根据设计不可能。Swing不与实际将屏幕数据发送到监视器的位图光栅DMA同步,因此在您忙于渲染时,DMA始终可能读取屏幕缓冲区(可能的例外是全屏模式)

要至少最大限度地减少闪烁,请遵循建议的自定义摆动绘制方法:


您可以使用Swing计时器或SwingUtilities.invokeAndWait/invokeLater从另一个线程(在您的设计中效果最好的线程)轻松触发EDT上的定期重新绘制。

闪烁可能是因为更新后的渲染速度不够快

现在我建议您在渲染组件时使用
Swing
s
paintComponent(Graphics g)
。也就是说,要解决闪烁问题,请在
JFrame

如果没有可用的代码,我只能提供一个通用的解决方案

JFrame jframe = new JFrame ();

...

BufferStrategy bufferstrategy = jframe.getBufferStrategy ();

if (bufferstrategy == null) {
    jframe.createBufferStrategy(3);
    return;
}

g.dispose();
bufferstrategy.show();
要阅读更多关于
缓冲策略的信息,我建议在

小纸条


您的代码中没有理由存储
JPanel panler
bufferedImageImager
。您可以直接在
panler
上调用相应的方法。
ImageR

谢谢您的回答。我阅读了您推荐的Oracle教程,并获得了我的paintComponent()函数在主线程上正常工作。为此,我从draw()调用JPanel().repaint()函数。接下来我将学习如何使用BufferStrategy。

您应该按照Swing graphics教程使用被动图形。此外,您的代码通过在后台线程中进行关键Swing调用来完全忽略Swing线程规则。我敦促您不要这样做。变量名不应以大写字符开头。请遵循Java惯例在任何教科书或教程中都会演示ch。不要自己编!
JFrame jframe = new JFrame ();

...

BufferStrategy bufferstrategy = jframe.getBufferStrategy ();

if (bufferstrategy == null) {
    jframe.createBufferStrategy(3);
    return;
}

g.dispose();
bufferstrategy.show();