Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向Jframe.getcontentpane()添加多个组件_Java_Swing_Jframe_Jpanel - Fatal编程技术网

Java 向Jframe.getcontentpane()添加多个组件

Java 向Jframe.getcontentpane()添加多个组件,java,swing,jframe,jpanel,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; thi

我有一个扩展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);
    }

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

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

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

}

如果你想把它们都画在一个点上,那么就这样做——用同一个JPanel的paintComponent方法(而不是画图方法)把它们都画出来。一种方法是将Triangle类从JPanel类中分离出来,给您的Triangle类一个公共的void draw(Graphics g)方法,给您的JPanel 3个三角形实例(或三角形的ArrayList),然后让JPanel的paintComponent方法调用draw(Graphics g)处理它所持有的所有三角形对象


另一方面,如果您想让每个三角形显示在自己的JPanel中,并让面板并排或一个在另一个下方显示(您的问题在这个问题上不清楚),然后,您需要学习布局管理器教程,并使用这些知识将contentPane的布局设置为可以轻松显示多个JPanel的布局。目前,您正在将所有三角形/JPanel添加到contentPane,在教程中您会发现顶级容器(即JFrame)的contentPane使用BorderLayout作为其默认布局管理器。如果使用容器将组件添加到BorderLayout,但不指定位置,则组件将位于BorderLayout.CENTER位置,并将覆盖以前添加的任何内容。

如果要在一个点上绘制所有组件,请执行此操作--使用相同的JPanel的paintComponent方法(而不是绘制方法)绘制所有组件。一种方法是将Triangle类从JPanel类中分离出来,给您的Triangle类一个公共的void draw(Graphics g)方法,给您的JPanel 3个三角形实例(或三角形的ArrayList),然后让JPanel的paintComponent方法调用draw(Graphics g)处理它所持有的所有三角形对象


另一方面,如果您想让每个三角形显示在自己的JPanel中,并让面板并排或一个在另一个下方显示(您的问题在这个问题上不清楚),然后,您需要学习布局管理器教程,并使用这些知识将contentPane的布局设置为可以轻松显示多个JPanel的布局。目前,您正在将所有三角形/JPanel添加到contentPane,在教程中您会发现顶级容器(即JFrame)的contentPane使用BorderLayout作为其默认布局管理器。如果您使用容器将组件添加到BorderLayout,但未指定位置,它将位于BorderLayout.CENTER位置,并将覆盖以前添加到该位置的任何内容。

我也遇到了同样的问题,每次添加到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();

我也遇到了同样的问题,每次添加到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();

我打算使用Separate JPanel,但您的建议是正确的,inc.paint vs paintComponent+1您可以提到一些您参考的教程吗。@user906763您可能想看看我将使用Separate JPanel,但您的建议是正确的,inc.paint vs paintComponent+1您能提到一些您正在参考的教程吗。@user906763您可能想看看