我一整天都在努力让这一切成功,但没有成功。可能出现什么问题?
我想在我的JFrame中同时打印2个线程:
Thread-1:打印正方形
Thread-2:打印圆圈
我最终只在JFrame上打印了一个线程。另一个被执行但不在JFrame中打印
看,只有方格打印:
这是我的主要课程:
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){}
}
}
}
答案 0 :(得分:1)
JFrame window = new JFrame();
window.add(circle);
window.add(square);
JFrame的默认布局管理器是BorderLayout。使用BorderLayout将组件添加到面板并且未指定约束时,组件将转到CENTER
。但是,CENTER
中只能显示一个组件,因此只会添加最后添加的组件。
您可以使用OverlayLayout
,它允许您将两个面板堆叠在一起。当然,您需要使顶部面板不透明。
更简单的解决方案是不要尝试使用两个面板,只需在可以显示圆形或正方形的面板上创建。
另外,你的绘画代码是错误的。你不应该使用paintImmediately(...)来绘画。每次调用方法时,paintComponent()方法都应绘制每个对象。尝试调整框架大小,您将看到所有对象都消失,因为paintComponent()方法将清除所有旧画作。
请参阅Custom Painting Approaches了解这种绘画的两种常用方法。