Вновь созданный графический объект отображается только после изменения размера кадра - PullRequest
4 голосов
/ 26 сентября 2011

Это продолжение этого поста

У меня есть набор графики произвольного размера, добавляемый и рисуемый в компоненте JPanel.У меня есть кнопка, которая добавляет новый объект рисования в тот же JPanel, но не отображается, пока я не изменил размер окна.Я добавил информацию 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);
} 
}

Ответы [ 2 ]

7 голосов
/ 26 сентября 2011

У меня есть кнопка, которая добавляет новый объект рисования к тому же JPanel, но не отображается, пока я не изменим размер окна

Когда вы добавляете компонент в видимый графический интерфейскод должен быть:

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

(редактор: изменен на подтвердить )

0 голосов
/ 13 августа 2014

Я попробовал себя и обнаружил, что метод paintChildren () решил проблему.

...