组件不会显示在自定义JPanel / JComponent中

时间:2010-06-03 15:11:26

标签: java swing

我创建了一个自定义swing组件。我可以看到它(绘制绘制方法的网格),但是没有显示添加的按钮(由println验证)。我做错了什么?

背景信息:我正在尝试构建一个可见对象树,如Flash / AS3显示列表。

public class MapPanel extends JComponent { // or extends JPanel, same effect

    private static final long serialVersionUID = 4844990579260312742L;

    public MapPanel(ShapeMap map) {
        setBackground(Color.LIGHT_GRAY);
        setPreferredSize(new Dimension(1000,1000));
        setLayout(null);
        for (Layer l : map.getLayers()) {
//          LayerView layerView = new LayerView(l);
//          add(layerView);
            System.out.println(l);
            JButton test = new JButton(l.getName());
            add(test);
            validate();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {

        // necessary?
        super.paintComponent(g);

        // background
        g.setColor(getBackground());
        g.fillRect(0, 0, getWidth(), getHeight());

        // grid
        g.setColor(Color.GRAY);         
        for (double x = 0; x < getWidth(); x += 10) {
            g.drawLine((int)x, 0, (int)x, getHeight());
        }
        for (double y = 0; y < getHeight(); y += 10) {
            g.drawLine(0, (int)y, getWidth(), (int)y);
        }

    }

}

2 个答案:

答案 0 :(得分:2)

将null设置为布局管理器,然后添加按钮将不起任何作用。布局管理器负责计算子组件的边界,并将布局管理器设置为null有效地使所有按钮的边界为=(0,0,0,0)。

尝试调用test.setBounds(10,10,50,20)作为快速测试以查看按钮是否出现。如果他们这样做,他们将在完全相同的位置显示。从那里,您可以安装自定义布局管理器,为每个按钮提供所需的边界,或使用其中一个核心/第三方布局管理器。

答案 1 :(得分:1)

如果您给我们SSCCE,我们会更容易诊断您的问题。目前,我们可能没有足够的信息来解决您的问题。

  

我可以看到它(来自油漆的网格   方法绘制),

我不知道这意味着什么,在发布的代码中没有paint()方法。 (但我认为很容易假设你的意思是paintComponent(g)

然而,看起来问题是你是一个“空布局”。除非您手动设置孩子的大小和位置,否则孩子不会画画。

您应该阅读LayoutManagers的快速教程。在绘制组件时,它可能会使您更容易。