我的JFrame对象中只有一个Thread Paints,为什么不是另一个?

时间:2017-09-18 01:32:25

标签: java multithreading swing

我一整天都在努力让这一切成功,但没有成功。可能出现什么问题?

我想在我的JFrame中同时打印2个线程:
Thread-1:打印正方形
Thread-2:打印圆圈
我最终只在JFrame上打印了一个线程。另一个被执行但不在JFrame中打印 看,只有方格打印:
enter image description here

这是我的主要课程:

public class Main {

    public static void main(String[] args) {

        FigurePlacer circle = new FigurePlacer("circle");
        FigurePlacer square = new FigurePlacer("square");

        JFrame window = new JFrame();
        window.add(circle);
        window.add(square);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setTitle("Task");
        window.setSize(700, 700);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
     }
}

这是线程类:

import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.Color;
import java.util.Random;

public class FigurePlacer extends JPanel implements Runnable{

    String figure;
    final int width = 700;
    final int height = 700;
    int x_pos = 0;
    int y_pos = 0;
    int x_width = 50;
    int y_height = 50;

    public FigurePlacer(String str){
        figure = str;
        randomCoord();
        Thread th = new Thread (this);
        th.start();
    }

    private void randomCoord(){ //this ramdomize x,y coord to place a new object
        Random random = new Random();
        x_pos = random.nextInt(width);
        y_pos = random.nextInt(height);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK); //sets the black color in background
        g.fillRect(0, 0, 700, 700);
        System.out.println(figure);
        switch (figure){
            case "square":     
            g.setColor(Color.GREEN);
            g.fillRect(x_pos, y_pos, x_width, y_height);
            break;

            case "circle":
            g.setColor(Color.BLUE);
            g.fillOval(x_pos, y_pos, x_width, y_height);
            break;
        }
    }

    @Override
    public void run(){ //paints the objects
        while (true){
            randomCoord();
            paintImmediately(x_pos, y_pos, x_width, y_height);
            try{
                Thread.sleep (50);
            }
            catch (InterruptedException ex){}
        }
    }  

}

1 个答案:

答案 0 :(得分:1)

    JFrame window = new JFrame();
    window.add(circle);
    window.add(square);

JFrame的默认布局管理器是BorderLayout。使用BorderLayout将组件添加到面板并且未指定约束时,组件将转到CENTER。但是,CENTER中只能显示一个组件,因此只会添加最后添加的组件。

您可以使用OverlayLayout,它允许您将两个面板堆叠在一起。当然,您需要使顶部面板不透明。

更简单的解决方案是不要尝试使用两个面板,只需在可以显示圆形或正方形的面板上创建。

另外,你的绘画代码是错误的。你不应该使用paintImmediately(...)来绘画。每次调用方法时,paintComponent()方法都应绘制每个对象。尝试调整框架大小,您将看到所有对象都消失,因为paintComponent()方法将清除所有旧画作。

请参阅Custom Painting Approaches了解这种绘画的两种常用方法。