簡體   English   中英

多線程無法在Java中繪制圖形

[英]Multi-Threading Can't Drawing Figures in Java

我想創建2個線程。 一個帶有移動矩形的線程,另一個帶有第二矩形的線程,第一個之后。 這是我想達到的圖片。 在此處輸入圖片說明 在此處輸入圖片說明

如何將我的類“ 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();
    }


}

這里是小方塊:

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

    }
}

我發現在Runnable的public void run()中,我無法在此處繪制。

你沒看錯 java.awtjavax.swing大多數方法只能在事件分發線程內調用。 也就是說,只能從一種或另一種事件處理程序中調用它們。

設置兩個矩形動畫的最佳方法可能是設置一個以固定間隔(例如,每秒30x或每秒60x)觸發的Swing計時器 ,然后在計時器對象調用的處理程序方法中進行繪制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM