我创建了一个自定义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);
}
}
}
答案 0 :(得分:2)
将null设置为布局管理器,然后添加按钮将不起任何作用。布局管理器负责计算子组件的边界,并将布局管理器设置为null有效地使所有按钮的边界为=(0,0,0,0)。
尝试调用test.setBounds(10,10,50,20)作为快速测试以查看按钮是否出现。如果他们这样做,他们将在完全相同的位置显示。从那里,您可以安装自定义布局管理器,为每个按钮提供所需的边界,或使用其中一个核心/第三方布局管理器。
答案 1 :(得分:1)
如果您给我们SSCCE,我们会更容易诊断您的问题。目前,我们可能没有足够的信息来解决您的问题。
我可以看到它(来自油漆的网格 方法绘制),
我不知道这意味着什么,在发布的代码中没有paint()方法。 (但我认为很容易假设你的意思是paintComponent(g)
)
然而,看起来问题是你是一个“空布局”。除非您手动设置孩子的大小和位置,否则孩子不会画画。
您应该阅读LayoutManager
s的快速教程。在绘制组件时,它可能会使您更容易。