开发者

Components don't show in custom JPanel/JComponent

开发者 https://www.devze.com 2023-01-02 17:23 出处:网络
I\'ve created a custom swing component. I can see it (the grid from the paint method is drawn), but the buttons that are added (verified by println) aren\'t shown. What am I doing wrong?

I've created a custom swing component. I can see it (the grid from the paint method is drawn), but the buttons that are added (verified by println) aren't shown. What am I doing wrong?

Background information: I'm trying to build a tree of visible objects like the Flash/AS3 display list.

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);
        }

    }

}


Setting null as the layout manager and then adding buttons will not have any effect. A layout manager is responsible for computing the bounds of the children components, and setting layout manager to null effectively leaves all your buttons with bounds = (0,0,0,0).

Try calling test.setBounds(10, 10, 50, 20) as a quick test to see if the buttons appear. If they do, they will be shown at exactly the same spot. From there you can either install a custom layout manager that gives each button the required bounds, or use one of the core / third party layout managers.


It would be easier for us to diagnose your problem if you gave us a SSCCE. As it stands, we may not have enough information to fix your problem.

I can see it (the grid from the paint method is drawn),

I don't know what that means, there is no paint() method in the posted code. (But I suppose it is easy enough to assume that you meant paintComponent(g))

However, it looks like the problem is that you are uisng a "null layout". The children will not paint unless you manually set the size and location of the children.

You should probably read a quick tutorial on LayoutManagers. It may make things easier for you when drawing components.

0

精彩评论

暂无评论...
验证码 换一张
取 消