java - Java中多线程无法画图

标签 java multithreading jpanel runnable

我想创建 2 个线程。 一个线程具有移动矩形,另一个线程具有跟随第一个矩形的第二个矩形。 这是我想要实现的图片。 enter image description here enter image description here

如何将我的类“MovingRectangle”添加到线程? 或者我可以画一个可以在线程中移动的图形(如矩形)吗? 我发现在 Runnable 中的 public void run() 中我无法在这里绘图(也许我错了_)... 抱歉这个问题,我几天前开始使用Java,但找不到这个问题的答案。 主要内容如下:

import javax.swing.JFrame;

public class Main extends JFrame
{
            public Main()
            { }

        public static void main (String[] args) throws InterruptedException {

            JFrame f = new JFrame();

            New_Thread x = new New_Thread();
            f.add(x);
            f.setTitle("Window");
            f.setVisible(true);
            f.setSize(800,800);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            Thread t1 = new Thread (new New_Thread());
            t1.start();
            Thread t2 = new Thread (new New_Thread());
            t2.start();

        }
}

以下是移动此矩形的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;

public class MovingRectangle extends square implements ActionListener {

    Timer t = new Timer (50,this);
    double x = 50;
    double y= 700;
    double velX= 10;
    double velY=10;

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.gray);
        Rectangle2D rectangle = new Rectangle2D.Double(x,y,40,40);
        g2.fill(rectangle);
        t.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

       y = y - velY;
       if (y==90)
       {
           velY=0;
           x=x+velX;
       }

       if (x==600)
       {
           velY=10;
           velY=-velY;
       }

       if (x==600 && y == 700)
       {
           velY=0;
       }

        repaint();
    }


}

这里是小方 block :

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;

public class square extends JPanel
{

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.PINK);
        Rectangle2D towar1 = new Rectangle2D.Double(20,500,30,30);
        Rectangle2D towar2 = new Rectangle2D.Double(20,300,30,30);
        Rectangle2D towar3 = new Rectangle2D.Double(20,100,30,30);
        Rectangle2D towar4 = new Rectangle2D.Double(150,60,30,30);
        Rectangle2D towar5 = new Rectangle2D.Double(350,60,30,30);
        Rectangle2D towar6 = new Rectangle2D.Double(550,60,30,30);
        Rectangle2D towar7 = new Rectangle2D.Double(640,500,30,30);
        Rectangle2D towar8 = new Rectangle2D.Double(640,300,30,30);
        Rectangle2D towar9 = new Rectangle2D.Double(640,100,30,30);
        g2.fill(towar1);
        g2.fill(towar2);
        g2.fill(towar3);
        g2.fill(towar4);
        g2.fill(towar5);
        g2.fill(towar6);
        g2.fill(towar7);
        g2.fill(towar8);
        g2.fill(towar9);
    }
}

这里是新线程,我想添加 MovingRectangle 类(或者只是想添加代码来移动图形),但我不知道该怎么做。

public class New_Thread extends MovingRectangle implements Runnable {
    @Override

    public void run()
    {

    }
}

最佳答案

I found that in public void run() in Runnable i can't drawing here.

你没有看错。 java.awtjavax.swing 中的大多数方法只能从 event dispatch thread 中调用。 。也就是说,它们只能从一种或另一种事件处理程序中调用。

对两个矩形进行动画处理的最佳方法可能是设置一个 Swing Timer 定期触发(例如,每秒 30 次或每秒 60 次),并从计时器对象调用的处理程序方法中进行绘图。

关于java - Java中多线程无法画图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49757705/

相关文章:

java - 如何使用 jqplot 仅显示堆积条形图的标签总和?

c++ - 在发布序列中使用原子读-修改-写操作

multithreading - WCF - 生成一个新的工作线程并返回调用者而不等待它完成

java - 使用 Java 为视障人士放大屏幕

java - 向 JPanel 添加滚动

java - 使用 Selenium Webdriver 获取网页中的所有非隐藏链接并单击

java - 有没有一种通用的方法可以将 JUnit 测试标记为待处理?

java - 如何通过给定的消息类型名称和原始字节获取 Java 对象的 protobuf?

C++11:确保一次写入多次读取的定义语义?

java - 将绘图区域添加到空布局 GUI