将多个组件添加到Jframe.getcontentpane()

时间:2011-09-27 15:36:57

标签: java swing jframe jpanel

我有一个扩展JPanel并绘制三角形的类。我从其他类调用它来创建三个三角形,但是当绘制第三个三角形时,前两个三角形消失了。如何添加多个一起显示的三角形。 代码如下:

Triangle.Java:

public class Triangle extends JPanel{

    Point p1, p2, p3;
    public Triangle(Point _p1, Point _p2, Point _p3)
    {
        this.p1=_p1;
        this.p2=_p2;
        this.p3=_p3;
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        int[] xs = {p1.x,p2.x,p3.x};
        int[] ys = {p1.y,p2.y,p3.y};
        Polygon triangle = new Polygon(xs, ys, xs.length);
        g.fillPolygon(triangle);
    }

}

SwingApplication.java:

public class SwingApplication {

    public static void main(String[] args) {
        Triangle triangle1=new Triangle(new Point(120,10), new Point(170,110),new Point(220,10));
        Triangle triangle2=new Triangle(new Point(120,210), new Point(170,110), new Point(220,210));
        Triangle triangle3=new Triangle(new Point(10,400), new Point(170,210), new Point(320,400));
        JFrame frame = new JFrame("Swing Application - Question 2");
        //frame.setLayout(new FlowLayout());
        frame.getContentPane().add(triangle1);
        frame.getContentPane().add(triangle2);
        frame.getContentPane().add(triangle3);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 450);
        //frame.pack();
        frame.setVisible(true);
    }

}

2 个答案:

答案 0 :(得分:5)

如果你想在一个地方全部绘制它们,那么这样做 - 在同一个JPanel的paintComponent方法(不是绘制方法)中绘制它们。一种方法是将Triangle类与JPanel类分开,为Triangle类提供一个公共的void draw(Graphics g)方法,给你的JPanel 3 Triangle实例(或Triangle的ArrayList),然后让JPanel的paintComponent方法在它所拥有的所有三角形对象上调用draw(Graphics g)。

另一方面,如果您想让每个三角形显示在自己的JPanel中并且面板并排显示或者一个在另一个之下(您的问题在这个问题上不明确),那么您需要学习布局管理器教程并使用此知识将contentPane的布局设置为将轻松显示多个JPanel的布局。目前,您正在将所有Triangle / JPanel添加到contentPane,您将在教程中找到顶级容器(即JFrame)的contentPane使用BorderLayout作为其默认布局管理器。如果将一个组件添加到BorderLayout-using容器而不指定where,它将落在BorderLayout.CENTER位置,并将掩盖之前添加的任何内容。

答案 1 :(得分:0)

我遇到了同样的问题并尝试在每次添加到contentPane后调用我的应用程序中的frame.revalidate()和frame.repaint()方法,它工作正常。我不知道,它有多常规,但对我来说很有用。

frame.getContentPane().add(triangle1);
frame.revalidate();
frame.repaint();
frame.getContentPane().add(triangle2);
frame.revalidate();
frame.repaint();
frame.getContentPane().add(triangle3);
frame.revalidate();
frame.repaint();