Многопоточность не позволяет рисовать рисунки на Java

Я хочу создать 2 потока. Одна нить с движущимся прямоугольником, а другая нить со вторым прямоугольником, следующим за первым. Вот картинки, которых я хотел бы достичь. Многопоточность не позволяет рисовать рисунки на JavaМногопоточность не позволяет рисовать рисунки на Java

Как я могу добавить свой класс "MovingRectangle" в поток? Или я могу нарисовать фигуру (например, прямоугольник), которая может двигаться по нитке? Я обнаружил, что в public void run () в Runnable я не могу рисовать здесь (возможно, я ошибаюсь _) ... Извините за этот вопрос, я запустил 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();
    }


}

Вот для квадратов:

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()
    {

    }
}

Графические элементы обычно однопоточны, так что в целом это не очень хорошая идея.

Kayaman 10.04.2018 18:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
196
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Вы не ошиблись. Большинство методов в java.awt и javax.swing можно вызывать только из поток отправки событий. То есть они могут вызываться только из обработчика событий того или иного типа.

Вероятно, лучший способ анимировать ваши два прямоугольника - это настроить Качели таймера, который срабатывает с регулярными интервалами (например, 30x в секунду или 60x в секунду), и рисовать из метода обработчика, который вызывается объектом таймера.

Другие вопросы по теме