Java 向Jframe.getcontentpane()添加多个组件
我有一个扩展JPanel并绘制三角形的类。我从另一个类调用它来创建三个三角形,但当绘制第三个三角形时,前两个三角形消失了。如何添加一起显示的多个三角形。 代码如下: Triangle.Java: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
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您可能想看看