Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:同时使用线程和图形需要一些帮助吗_Java_Multithreading_Graphics - Fatal编程技术网

Java:同时使用线程和图形需要一些帮助吗

Java:同时使用线程和图形需要一些帮助吗,java,multithreading,graphics,Java,Multithreading,Graphics,作为这方面的初学者,我仍然需要一些关于如何同时使用线程和图形的解释。我想做的是非常基本的:在一帧中只让两个球同时移动。以下是我尝试过的: public class Main extends JFrame { private static final long serialVersionUID = 1L; private static final int _HEIGHT = 320, _WIDTH = 480; private MyPanel panel; pub

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

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();
            }
        }
    }
}
public类主框架
{
私有静态最终长serialVersionUID=1L;
专用静态最终内部高度=320,宽度=480;
私人小组;
公用干管()
{
超级(“测试”);
panel=新的MyPanel();
此.setContentPane(面板);
此.立根(350100,高,宽);
此.setDefaultCloseOperation(关闭时退出);
此.setVisible(true);
}
公共静态void main(字符串[]args)
{
新的Main();
}
}
公共类MyPanel扩展了JPanel
{
私有静态最终长serialVersionUID=1L;
ArrayList列表球;
公共事务委员会()
{
这个.背景(颜色.白色);
listbolls=newarraylist();
添加(新球(30,30));
}
@凌驾
公共空间涂料(图形gr)
{
Graphics2D g=(Graphics2D)gr;
g、 setRenderingHint(RenderingHits.KEY\u ANTIALIASING,RenderingHits.VALUE\u ANTIALIAS\u ON);
g、 设定行程(新基本行程(3f));
超级油漆(g);
同步(列表球){
对于(球b:列表球)
{
b、 提取本身(g);
}   
}
}
}
公共类Ball扩展JPanel实现Runnable
{
私有静态最终长serialVersionUID=1L;
私有整数x,y;
私有线程;
公共球(整数x,整数y)
{
这个.x=x;
这个。y=y;
}
公共图纸本身(图形2D g)
{
g、 设置颜色(颜色为黑色);
g、 椭圆形(x,y,13,13);
}
公开募捐
{
Thread currentThread=Thread.currentThread();
while(线程==当前线程)
{
x+=2;
y+=2;
重新油漆();
试一试{
睡眠(200);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
}
但是这样不行(球不出现),我也不知道该怎么办。。请帮忙

  • Ball
    无需扩展
    JPanel
    ,您没有使用
    JPanel
    或其子项的任何功能
  • 您不应该覆盖
    paint
    ,建议您改用
    paintComponent
    。原因很多,但您会喜欢的一个事实是
    paint
    不是双缓冲的,但是
    paintComponent
    闪烁的可能性较小
  • 如果您必须使用
    线程
    ,我建议您使用单个
    线程
    ,更新其中的所有球,然后更新显示。这通常会减少您使用的资源数量,并使其更具可扩展性
  • 您从不启动
    线程
    ,这意味着永远不会调用
    Ball
    run
    方法
  • Swing中的并发性有一些特殊的问题。我建议大家看一看,了解一下概况

    已更新

    有许多优秀的例子可以找到,所以,这里有一些我在过去做过


    首先让球进行渲染,然后再担心线程问题。我个人不会在球里面放任何线程代码;相反,管理面板中的线程以定期重画其内容。