gpt4 book ai didi

Java : Need some help to use Threads and Graphics simultaneously

转载 作者:行者123 更新时间:2023-11-30 04:30:48 24 4
gpt4 key购买 nike

作为初学者,我仍然需要一些关于如何同时使用线程和图形的解释。我想做的是非常基本的:只让两个球在一个框架中同时移动。这是我尝试过的:

public class Main extends JFrame
{
private static final long serialVersionUID = 1L;
private static final int _HEIGHT = 320, _WIDTH = 480;
private MyPanel panel;

public Main()
{
super("Test");

panel = new MyPanel();

this.setContentPane(panel);
this.setBounds(350,100,_HEIGHT,_WIDTH);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
}

public static void main(String[] args)
{
new Main();
}
}


public class MyPanel extends JPanel
{
private static final long serialVersionUID = 1L;
ArrayList<Ball> listBalls;

public MyPanel()
{
this.setBackground(Color.WHITE);
listBalls = new ArrayList<Ball>();
listBalls.add(new Ball(30,30));
}

@Override
public void paint(Graphics gr)
{
Graphics2D g = (Graphics2D) gr;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setStroke(new BasicStroke(3f));
super.paint(g);
synchronized (listBalls) {
for(Ball b : listBalls)
{
b.drawItself(g);
}
}
}
}



public class Ball extends JPanel implements Runnable
{
private static final long serialVersionUID = 1L;
private int x, y;
private Thread thread;

public Ball(int x, int y)
{
this.x = x;
this.y = y;
}

public void drawItself(Graphics2D g)
{
g.setColor(Color.BLACK);
g.fillOval(x, y, 13, 13);
}

public void run()
{
Thread currentThread = Thread.currentThread();
while (thread == currentThread)
{
x+=2;
y+=2;
repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

但这行不通(球没有出现),我不知道该怎么做..请帮忙!

最佳答案

  1. Ball 不需要扩展 JPanel,您没有使用 JPanel 或其子项中的任何功能。<
  2. 您不应重写paint,建议您使用paintComponent。原因有很多,但您会喜欢的一个事实是 paint 不是双缓冲的,但 paintComponent 是双缓冲的 - 闪烁的可能性较小
  3. 如果您必须使用线程,我建议您使用单个线程并更新其中的所有球,然后更新显示。这通常会减少您使用的资源数量并使其更具可扩展性。
  4. 您永远不会启动您的Thread,这意味着Ballrun 方法永远不会被调用

Swing 中的并发性需要特别关注。我建议看一下 Concurrency in Swing以获得概述。

已更新

在 SO 上可以找到许多优秀的示例,以下是我过去做过的一些示例...

关于Java : Need some help to use Threads and Graphics simultaneously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14695453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com