JPanel中的多个组件未显示

时间:2016-10-12 13:16:09

标签: java swing jframe jpanel

我尝试了很多解决方案,但我不知道我的代码有什么问题。 Basicaly我想在窗口中显示形状,FlowLayout不显示任何内容,BorderLayout显示最后一个不是我想要的。忽略shape.draw()方法,它只打印形状的坐标。 Shape扩展了JComponent。

package Shapes;

import javax.swing.*;
import java.awt.*;

/**
 * Created by Matej on 10/12/2016.
 */

public class TestShapes extends JFrame
{
    //static Shape[] shapes = new Shape[3];
    public static void main(String[] args)
    {
        Shape[] shapes = new Shape[3];
        shapes[0] = new Circle(300,100,20);
        shapes[1] = new Rectangle(100,100,40,60);
        shapes[2] = new RedRectangle(200,200,20,30);

        TestShapes window = new TestShapes();

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(500,500);

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());

        for(Shape shape:shapes)
        {
            shape.printName();
            shape.draw();
            panel.add(shape);
        }

        window.add(panel);
        window.setVisible(true);

    }

    public void paint (Graphics g)
    {
        super.paint(g);
    }
}

1 个答案:

答案 0 :(得分:1)

您没有向我们展示您的Shape类和子类的代码,但无论您做错了什么,修复都是没有让它们扩展JComponent 。而是将它们设置为逻辑而非组件类,并将它们传递到JPanel中,该JPanel将它们保存在ArrayList<...>中,并在其paintComponent方法覆盖中绘制它们。然后将此JPanel添加到JFrame的contentPane,BorderLayout.CENTER中,以便它可以显示其包含的形状。

请注意,JComponents默认为首选大小0,0,除非他们有其他理由不这样做 - 例如,如果它们包含具有首选大小的组件或者它们具有重写的getPreferredSize()方法。

但是,这也没有实际意义,因为您不希望在自己的组件中显示每个图形,因为这会不必要地限制您可以对图像执行的操作以及可以显示它们的位置。