[警告,我是初学者,我对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如何在这里提供帮助以及以何种方式使用它。
答案 0 :(得分:0)
默认情况下,Swing是双缓冲的。您正在覆盖框架的paint()方法,并且没有调用super.paint(...),因此您将丢失默认的双缓冲。
我听说添加一个JPanel可以让我加倍缓冲并获得更顺畅的体验
是的,这是进行自定义绘画的正确方法。您所做的一切都不是覆盖JPanel的paintComponent()
方法并将面板添加到框架中。阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。
另外,在绘制方法中,你永远不应该有一个带有Thread.sleep()的while循环。要做动画,你应该使用Swing Timer
。我上面提供的教程链接也有Timers
部分,或者您可以在论坛/网站上搜索示例。