【问题标题】:adding multiple components to Jframe.getcontentpane()向 Jframe.getcontentpane() 添加多个组件
【发布时间】:2011-09-27 15:36:56
【问题描述】:

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

}

【问题讨论】:

    标签: java swing jframe jpanel


    【解决方案1】:

    如果您想将它们全部绘制在一个点上,那么就这样做——在同一个 JPanel 的paintComponent 方法(不是paint 方法)中将它们全部绘制出来。一种方法是将 Triangle 类与 JPanel 类分开,为您的 Triangle 类提供一个公共 void draw(Graphics g) 方法,为您的 JPanel 3 个 Triangle 实例(或 Triangle 的 ArrayList)提供一个 JPanel 的paintComponent在它持有的所有 Triangle 对象上调用 draw(Graphics g) 方法。

    另一方面,如果您希望每个 Triangle 显示在其自己的 JPanel 中,并让面板并排显示或在另一个下方显示(您的问题在这个问题上不清楚),那么您需要研究布局管理器教程并使用这些知识将 contentPane 的布局设置为可以轻松显示多个 JPanel 的布局。目前,您正在将所有 Triangle/JPanels 添加到 contentPane,您会在教程中发现顶级容器(即 JFrame)的 contentPane 使用 BorderLayout 作为其默认布局管理器。如果您将组件添加到使用 BorderLayout 的容器中而不指定位置,它将落在 BorderLayout.CENTER 位置,并且会覆盖之前添加的任何内容。

    【讨论】:

    • 我打算使用单独的 JPanel,但你的建议是正确的,公司。油漆与油漆组件+1
    • 能否请您提及一些您所指的教程。
    • @user906763 你可能想看看here
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      相关资源
      最近更新 更多