在JPanel中设置动画的动画

时间:2018-03-28 19:02:59

标签: java multithreading graphics2d

首先在这里寻找我。一直在寻找,但似乎无法找到答案。

我正在完成一项学校作业。给了一个ui,并且应该让它中的不同面板在不同的线程中做不同的事情。无论如何,我试图在其中一个JPanel内旋转一个三角形。我设法绘制它并稍微旋转它,但当我尝试循环更新它时它只是闪烁然后再次消失。下面是我写的代码。

StartAssignment,启动应用程序

public class StartAssignment1 {

public static void main(String[] args) {
    Controller controller = new Controller();
}

Controller,接收来自ui的调用并执行其他类中的各种函数

public class Controller {
private GUIAssignment1 gui = new GUIAssignment1(this);
private RotateShape rotateShape;
private Thread t1;

public Controller() {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            gui.Start();
        }
    });
}

public void startT1(JPanel panel) {
    rotateShape = new RotateShape(panel);
    t1 = new Thread(rotateShape);
    t1.start();
}

public void t1Shutdown() {
    rotateShape.shutdown();
}

RotateShape,我试图旋转该死的东西

public class RotateShape implements Runnable {
JPanel panel;
private volatile boolean t1Running = true;

public RotateShape(JPanel panel) {
    this.panel = panel;
}

private void draw() {
    Graphics2D g2 = (Graphics2D) panel.getGraphics();
    g2.rotate(Math.toRadians(10));
    g2.drawPolygon(new int[] {50,  100,  150}, new int[] {150, 50, 150}, 3);
}

public void shutdown() {
    t1Running = false;
    System.out.println("Shutdown");
}

@Override
public void run() {
    while (t1Running) {
        try {
            draw();
            Thread.sleep(500);
            System.out.println("loop working");
            panel.repaint();
            panel.revalidate();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定,因为我无法访问您的GUI代码,因此无法自行测试,但这是一个想法:

您似乎在每次重新渲染时(即每次调用Graphics2D)将draw()对象旋转固定数量。内部JPanel代码可能会在每次重新渲染之前以默认旋转方式启动Graphics2D,这可能就是为什么旋转只会导致形状稍微旋转。"

也许尝试将弧度偏移量的变量(例如double offset;)存储为RotateShape类的成员字段,在每次重新渲染时递增它,然后调用g2.rotate(Math.toRadians(offset));?< / p>

附录1:

它可能在前一个渲染之上绘制的原因是因为Graphics2D对象没有在重新渲染之间清除画布。解决这个问题的一种方法是&#34;清除&#34;通过填充覆盖整个画布的矩形,在draw()方法开头的画布。

附录2:

当您致电panel.repaint()时,它会触发paintComponent()对象的JPanel方法。因此,通过调用repaint()和您自己的draw()方法,您正在执行两个单独的渲染,这可能会导致一些图形错误。如果您能够扩展JPanel类并使用它,则应定义替换以替换draw()

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // TODO: add your rendering operations here
}

这样,对repaint()的调用应触发此方法。