双缓冲JFrame

时间:2014-11-26 13:40:26

标签: swing jframe jpanel double buffer

[警告,我是初学者,我对JFrame知之甚少,我刚刚开始,但你的帮助将不胜感激!]

所以,这是我的问题:我目前正在制作一些非常简单的东西,只是一个红色的矩形在屏幕上移动,我知道必须听起来像初学者一样。

我目前的代码:

package movement;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Movement extends JFrame {

public static void main(String[] args) {


    Movement m = new Movement();

    m.setSize(1000, 1000);
    m.setTitle("Movement");
    m.setBackground(Color.WHITE);
    m.setVisible(true);
    m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}

public void paint (Graphics g){
    int width = 0;
    int height = 0;
    int x = 100;
    int y = 900;

    while(x < 1000 && y > 0){
    //System.out.println("Success");    
    g.setColor(Color.RED);
    g.fillRect(x+width, y-height, 200, 200);
    //g.fillRect(x+width, y-height, 200, 200);
    try{
        Thread.sleep(10);
    } catch(InterruptedException e){
    }
    g.setColor(Color.WHITE);
    g.fillRect(x+width, y-height, 200, 200);
    //g.fillRect(x+width, y-height, 200, 200);
    width=width+1;
    height=height+1;

    }


}

}

因为你可以看到它有效,但是由于只有一个缓冲区,因此图像会断断续续并轻弹一下。我听说添加一个JPanel可以让我加倍缓冲并获得更流畅的体验,但由于我是一个真正的初学者,我不知道如何在这里实现它。我不确定JPanel如何在这里提供帮助以及以何种方式使用它。

1 个答案:

答案 0 :(得分:0)

默认情况下,Swing是双缓冲的。您正在覆盖框架的paint()方法,并且没有调用super.paint(...),因此您将丢失默认的双缓冲。

  

我听说添加一个JPanel可以让我加倍缓冲并获得更顺畅的体验

是的,这是进行自定义绘画的正确方法。您所做的一切都不是覆盖JPanel的paintComponent()方法并将面板添加到框架中。阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。

另外,在绘制方法中,你永远不应该有一个带有Thread.sleep()的while循环。要做动画,你应该使用Swing Timer。我上面提供的教程链接也有Timers部分,或者您可以在论坛/网站上搜索示例。