【问题标题】:GridLayout shows everything in the first cellGridLayout 显示第一个单元格中的所有内容
【发布时间】:2016-07-04 01:21:41
【问题描述】:

正如标题中所写,我有一个带有 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);
        }

    }

}

【问题讨论】:

标签: java swing layout-manager grid-layout


【解决方案1】:

不要在子组件上递归调用paintComponent。 Swing 的paint() 方法(由repaint() 触发)会自动为您调用子paintComponent 方法。传递给 MapPanel 的绘制方法的 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 中。

【讨论】:

  • @Override public void paintComponent(Graphics g) { super.paintComponent(g); }not 的效果完全相同!因此,鉴于不需要实际的自定义绘画,它应该被完全删除。
猜你喜欢
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多