Java 如何在扩展JPanel的类中创建bufferstrategy

Java 如何在扩展JPanel的类中创建bufferstrategy,java,multithreading,swing,bufferstrategy,Java,Multithreading,Swing,Bufferstrategy,我是Java的初学者,在一个扩展JPanel而不是canvas的类中创建bufferstaregy时遇到困难。有人能在这里演示如何添加缓冲区策略吗。 我写了非常简单的代码来说明我的问题。我在x和y位置移动矩形,但我看不到矩形在高速下的平滑移动。我希望缓冲策略能够解决这个问题。我可能错了。在任何情况下,如果我想看到平滑的矩形运动,我应该在这里做什么?我将非常感谢任何帮助。我在这个职位上呆了几天 import javax.swing.*; import java.awt.*; public clas

我是Java的初学者,在一个扩展JPanel而不是canvas的类中创建bufferstaregy时遇到困难。有人能在这里演示如何添加缓冲区策略吗。 我写了非常简单的代码来说明我的问题。我在x和y位置移动矩形,但我看不到矩形在高速下的平滑移动。我希望缓冲策略能够解决这个问题。我可能错了。在任何情况下,如果我想看到平滑的矩形运动,我应该在这里做什么?我将非常感谢任何帮助。我在这个职位上呆了几天

import javax.swing.*;
import java.awt.*;
public class simpleAnimation {
    public static void main(String args[]){
        Runnable animation = new moveAnimation();
        Thread thread = new Thread(animation);
        thread.start();
    }
}
// Creates window and performs run method
class moveAnimation implements Runnable{
    JFrame frame;
    int x = 0;
    int y = 0;
    boolean running = true;
    moveAnimation(){
        frame = new JFrame("Simple Animation");
        frame.setSize(600,600);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void run() {
        while(running == true){
            if(x<=500 || y<=500){
                x++;
                y++;
            }
            frame.add(new draw(x, y)); // I create new object here from different class which is below
            frame.setVisible(true);
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }

        }

    }
}

// I use this class to draw rect on frame
class draw extends JPanel{
    int x;
    int y;
    draw(int x, int y){
        this.x=x;
        this.y=y;
    }
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(Color.BLACK);
        g2.fillRect(0,0,getWidth(),getHeight());
        g2.setColor(Color.GREEN);
        g2.fillRect(x,y,50,50);
    }
}
import javax.swing.*;
导入java.awt.*;
公共类简化{
公共静态void main(字符串参数[]){
Runnable animation=新建移动动画();
线程=新线程(动画);
thread.start();
}
}
//创建窗口并执行run方法
类moveAnimation实现可运行{
JFrame框架;
int x=0;
int y=0;
布尔运行=真;
移动动画(){
帧=新的JFrame(“简单动画”);
框架。设置尺寸(600600);
frame.setresizeable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
公开募捐{
while(running==true){

如果(x您不能在仅使用该类扩展JPanel的类上真正创建缓冲策略,那么最好的选项就是设置为“setDoubleBuffered”这允许缓冲区为2,但它不能创建一个可访问的缓冲区策略。我建议您使用一个画布,将其添加到JPanel中,这样您可以获得一个缓冲区策略以及更平滑、更好控制的图形。Swing组件默认是双缓冲的,所以为什么要麻烦呢?顺便说一句,不要从调用GUI方法ode>Thread
除了事件调度线程之外&不要在EDT上睡觉。如果需要,使用基于Swing的
计时器。另外@andreThompson注释
running=true
应该
running==true
我强烈建议阅读官方的文章和课程。它们涵盖了你的c中的所有相关主题ode示例。@nachokk或更简单的,
(运行时)
;)