добавление нескольких компонентов в Jframe.getcontentpane () - PullRequest
1 голос
/ 27 сентября 2011

У меня есть класс, который расширяет 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 ]

5 голосов
/ 27 сентября 2011

Если вы хотите нарисовать их все в одном месте, то сделайте это - нарисуйте их все одним и тем же методом JPCanel paintComponent (а не методом рисования). Один из способов сделать это состоит в том, чтобы отделить класс Triangle от класса JPanel, дать вашему классу Triangle общедоступный метод void draw (Graphics g), присвоить экземплярам JPanel 3 Triangle (или ArrayList of Triangle), а затем получить JPC-файл paintComponent. вызов метода draw (Graphics g) для всех объектов Triangle, которые он содержит.

Если, с другой стороны, вы хотите, чтобы каждый треугольник отображался в своей собственной JPanel, и чтобы панели отображались рядом или одна под другой (ваш вопрос по этому вопросу неясен), вам нужно изучить обучающие программы менеджера макета и используйте эти знания, чтобы установить макет contentPane, который будет легко отображать более одного JPanel. В настоящее время вы добавляете все элементы Triangle / JPanels в contentPane, и в руководствах вы обнаружите, что contentPane контейнера верхнего уровня (то есть JFrame) использует BorderLayout в качестве менеджера компоновки по умолчанию. Если вы добавите компонент в контейнер с использованием BorderLayout без указания места, он попадет в позицию BorderLayout.CENTER и покроет все, что было добавлено ранее.

0 голосов
/ 24 января 2016

У меня была та же проблема, и я пытался вызывать методы frame.revalidate () и frame.repaint () в моем приложении после каждого добавления в contentPane, все работает нормально. Не знаю, насколько это регулярно, но у меня отлично работает.

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