java新创建的图形对象仅在调整帧大小后显示
这是this post的延续
我有一组随机大小的图形添加到JPanel组件上并绘制。我有一个按钮,它正在向同一个JPanel添加一个新的draw对象,但在重新调整窗口大小之前不会显示。我已经添加了this post中提到的EDT信息,还调用了组件上的repaint()方法。我还没有像Hovercraft建议的那样使用ArrayList,但我会的。我的大脑需要慢慢地理解事情
谢谢
代码分为两类
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ZombieDance extends JComponent {
JFrame canvas = new JFrame();
JPanel actionPanel = new JPanel();
JButton newZombie = new JButton("Add new Zombie");
ZombieDance(){
//create a couple default zombies
buildGUI();
Random rand = new Random();
int i,x,y,w,h;
//add zombies to my canvas
for (i=1;i<8;i++) {
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
x = rand.nextInt(50);
y = rand.nextInt(50);
w = rand.nextInt(50);
h = rand.nextInt(50);
canvas.add(new Zombie(x,y,w,h,r,g,b));
}
}
//prep the canvas
void buildGUI(){
actionPanel.add(newZombie);
canvas.add(actionPanel);
canvas.setLayout(new GridLayout(3,3));
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.setSize(400,400);
canvas.setBackground(Color.WHITE);
canvas.setVisible(true);
newZombie.addActionListener(new NewZombieClickHandler());
}
public class NewZombieClickHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
Random rand = new Random();
int x,y,w,h;
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
x = rand.nextInt(50);
y = rand.nextInt(50);
w = rand.nextInt(50);
h = rand.nextInt(50);
canvas.add(new Zombie(x,y,w,h,r,g,b));
canvas.repaint();
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ZombieDance();
}
});
}
}
二等舱
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Zombie extends JPanel{
private int x,y,w,h;
private float r,g,b;
Zombie(int argx, int argy, int argw, int argh, float argr, float argg, float argb){
x = argx;
y = argy;
w = argw;
h = argh;
r = argr;
g = argg;
b = argb;
}
public Dimension getPreferredSize() {
return new Dimension(20,20);
}
protected void paintComponent(Graphics gr) {
super.paintComponent(gr);
//g.drawString("Drawing canvas...",10,20);
gr.setColor(new Color(r,g,b));
gr.fillRect(x,y,h,w);
}
}
# 1 楼答案
将组件添加到可见GUI时,代码应为:
(编辑:更改为验证)
# 2 楼答案
我自己试过,发现paintChildren()方法解决了这个问题