首先在这里寻找我。一直在寻找,但似乎无法找到答案。
我正在完成一项学校作业。给了一个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();
}
}
}
答案 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()
的调用应触发此方法。