GridLayout显示第一个单元格中的所有内容

时间:2016-07-03 16:35:51

标签: java swing layout-manager grid-layout

正如标题中所写,我有一个带有GridLayout的JPanel,它显示了其他元素。我查了一下,发现每个CityPanel都是160x185像素,而主要的JPanel(容器)是960x556面板。这是什么错误?

public class MapPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    private CityPanel[][] cityPanels;

    public MapPanel() {
        super();
        ...
        createLayout();

    }

    @Override
    public void paintComponent(Graphics g) {


        super.paintComponent(g);

        this.setSize(super.getWidth(), super.getHeight());
        mapGrid.setSize(super.getWidth(), super.getHeight());

        for(int i = 0; i < cityPanels.length; i++) {
            for(int j = 0; j < cityPanels[i].length; j++) {
                cityPanels[i][j].paintComponent(g);
            }
        }

    }



    private void createLayout() {

        int columns = 6;
        int rows = 6;

        GridLayout layout = new GridLayout(rows, columns);
        this.setLayout(layout);

        cityPanels = new CityPanel[rows][columns]; //CityPanel extends JPanel
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                cityPanels[r][c] = new CityPanel();
                add(cityPanels[r][c]);
            }
        }

        for (City city : cities) {
            cityPanels[mapGrid.getRow(city) - 1][mapGrid.getColumn(city) - 1].initialize(city, mapGrid);
        }

    }

}

1 个答案:

答案 0 :(得分:0)

不要在子组件上递归调用paintComponent。 Swing的paint()方法(由repaint()触发)将自动为您调用子paintComponent方法。传递给MapPanel的paint方法的Graphics对象是使用MapPanel的维度和位置创建的。因此,通过cityPanels[i][j].paintComponent(g)将其传递给MapPanel的孩子将导致孩子CityPanel在其父母的位置呈现自己。假设CityPanel中的paintComponent方法正确,MapPanel paintComponent应该是。

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
}

为避免陷入渲染线程,

this.setSize(super.getWidth(), super.getHeight());
mapGrid.setSize(super.getWidth(), super.getHeight());
如果您的窗口未调整大小,则

应包含在createLayout()中;如果用户可以更改窗口大小,则应在ComponentListener中包含