gpt4 book ai didi

java - 新创建的图形对象仅在调整框架大小后显示

转载 作者:搜寻专家 更新时间:2023-11-01 02:15:16 26 4
gpt4 key购买 nike

这是 this post 的延续

我有一组随机大小的图形添加和绘制到 JPanel 组件上。我有一个按钮正在向同一个 JPanel 添加一个新的绘制对象,但在我重新调整窗口大小之前不会显示。我已经添加了 this post 中提到的 EDT 信息并且还在组件上调用了 repaint() 方法。我还没有使用 ArrayList,正如 Hovercraft 所建议的那样, 但是我会。我的大脑需要慢慢地理解事物。

谢谢。

代码在两个类中。

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);
}
}

最佳答案

I have a button that is adding a new draw object to the same JPanel but is not displaying until i re-size the window

当您将组件添加到可见的 GUI 时,代码应该是:

canvas.add(...);
canvas.validate();
//canvas.repaint(); // sometimes needed

(编辑:改为验证)

关于java - 新创建的图形对象仅在调整框架大小后显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com