未显示JComponent,未调用paintComponent

时间:2011-02-15 02:50:55

标签: java swing

我有一个扩展名为Cell的JComponent的类,它不会显示,并且从不调用它的paintComponent。 以下是我为使其工作而做的事情的简短清单:

  • 单元格构造函数包含this.setPreferredSizethis.setMaximumSizethis.setMinimumSize
  • 保存单元格的对象(JPanel的扩展名)为每个单元格调用this.add(cell)以及this.validate()
  • 保持其他JPanel's全部致电JPanels的{​​{1}}。
  • 主要.validate()已添加到JPanel的{​​{1}},并且contentPane JFrame被调用。

GUIFrontend.java

JFrame

GTGrid.java

.pack()

Cell.java (此方法非常庞大,因此只添加了选项)

import java.awt.*;
public class GUIFrontend extends JFrame{
    private static final long serialVersionUID = -7074700257172600349L;
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUIFrontend g = new GUIFrontend();
            }
        });
    }
    public GUIFrontend(){
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel primary = new JPanel();

        //Map
        JPanel mapContainer = new JPanel();
        mapContainer.setMinimumSize(new Dimension(772, 600));
        GTGrid gtg = new GTGrid();
        gtg.validate();
        mapContainer.add(gtg);
        mapContainer.validate();

        JPanel controls = new JPanel();
        controls.setBackground(Color.green);
        controls.setPreferredSize(new Dimension(160,600));

        primary.add(mapContainer);
        primary.add(controls);
        primary.validate();
        this.validate();
        this.getContentPane().add(primary);
        this.pack();
        this.validate();
        this.setVisible(true);
    }

}

2 个答案:

答案 0 :(得分:1)

  

向布局管理器添加太多元素是否有问题? (将有150 * 193 = 28,950个组件)

一个布局管理器的硬编码限制为512个组件。不记得它是哪一个。

当您使用GridLayout时,组件都会调整大小以适应可用于整个网格的空间。可能没有足够的空间可用,因此每个单元格的实际大小变为(0,0),在这种情况下,将永远不会在组件上调用paint方法。

答案 1 :(得分:0)

通过从我的Grid类(GTGrid扩展)中删除getWidth()getHeight()方法来解决问题。这些是我很少使用的旧方法,显然它们使得GTGrid不被绘制,因为它们被初始化为零。另外,我不得不删除getWidth()&来自Cell.java的getHeight()