JComprame上未正确绘制JComponents

时间:2013-12-27 09:38:22

标签: java swing paintcomponent gridbaglayout

我的课程主要延伸JFrame,课程Cell延伸JComponentCellpaintComponent()填充一个矩形(正方形,大小为50,50)。

我正在尝试使用JFrame 25 Cell个实例。它们的大小应该是50,50(与它们绘制的方块相同),但由于某种原因,当程序启动时,它们都不可见。

但是,当我放大窗户的时候,突然黑色方块应该像它们应该的那样。

为什么它们也不会显示在较小的(250,250)窗口中(在程序启动时启动的那个窗口)?

以下是代码:

班级主要:

import javax.swing.*;
import java.awt.*;
import java.awt.Event.*;

public class Main extends JFrame
{

    Cell[][] cells = new Cell[5][5];

    public Main(){

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(250,250);
        setTitle("");
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.insets = new Insets(5,5,5,5);

        for(int i=0;i<5;i++){
            gbc.gridy = i+1;
            gbc.gridx = 1;
            for(int j=0;j<5;j++){
                gbc.gridx = j+1;
                cells[i][j] = new Cell();
                add(cells[i][j], gbc);
            }
        }

        setVisible(true);

    }

    public static void main(String[] args)
    {

        Main m = new Main();

    }

}

Class Cell:

import javax.swing.*;
import java.awt.*;
import java.awt.Event.*;

public class Cell extends JComponent
{

    public void paintComponent(Graphics g){

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.fillRect(1, 1, 50, 50);

    }

    public Dimension getPreferredSize(){
        return new Dimension(50,50);
    }

}

由于

2 个答案:

答案 0 :(得分:2)

如果你将它们添加到底部,就在setVisbile(true)之前它应该可以正常工作

  setDefaultCloseOperation(EXIT_ON_CLOSE);
  pack();
  setTitle("");
  setVisible(true);

重要的部分是pack()你不应该设置框架的大小。而是打包它,以便它尊重所有首选的组件尺寸

经过测试,效果很好

答案 1 :(得分:2)

你得到了这个效果,因为你使用GridBagLayout

您可以在GridLayout的帮助下修复此问题,例如添加下一个组件:

setLayout(new GridLayout(5,5,5,5));

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        cells[i][j] = new Cell();
        add(cells[i][j]);
    }
}

enter image description here

或按建议使用pack()方法。