使用 paintComponent(g) 在同一类中生成两个图



如何从同一类中的 2 个不同方法生成 2 个paintComponent图形 g

我有 2 个不同的数据(FirstToursecondTour)通过我的构造函数传递,我想为每个巡回drawLine生成一个图形,要么在同一JPanel中,要么在两个不同的面板中。

以下是我在课堂上的第一个方法Draw

public void paintComponent(Graphics g) {        
             final int offset = 5;   
             super.paintComponent(g);
             g.drawString("Tourlaenge: " + distanceFirstTour, 150, 15);
             for (int i = 1; i <firstTour.tourSize() ;i++) {
                 int x1 = firstTour.getAdress(i-1).getX();
                 int y1 = firstTour.getAdress(i-1).getY();
                 int x2 = firstTour.getAdress(i).getX();
                 int y2 = firstTour.getAdress(i).getY();
                 String nameAdress = firstTour.getAdress(i).getName();
                 g.fillOval(x1, y1, 8, 8);
                 g.setColor(Color.red);
                 g.drawLine(x1 + offset, y1 + offset, x2 + offset, y2 + offset);
                 g.setColor(Color.black);      
                 g.drawString(nameAdress, x2 + offset , y2 - offset);  
                 g.drawString("Start", 10, 10); 
             }
          }

第二种方法与第一种方法相同,但数据SecondTour不同

public void paintChildren(Graphics g1){
               final int offset = 5;     
               super.paintChildren(g1);
                g1.drawString("Tourlaenge: " + distanceSecondTour, 150, 15);
             for (int i = 1; i <secondTour.tourSize() ;i++) {
                 int x1 = secondTour.getAdress(i-1).getX();
                 int y1 = secondTour.getAdress(i-1).getY();
                 int x2 = secondTour.getAdress(i).getX();
                 int y2 = secondTour.getAdress(i).getY();
                 String nameAdress = secondTour.getAdress(i).getName();
                 g1.fillOval(x1, y1, 10, 10);
                 g1.setColor(Color.red);
                 g1.drawLine(x1 + offset, y1 + offset, x2 + offset, y2 + offset);
                 g1.setColor(Color.blue);      
                 g1.drawString(nameAdress, x2 + offset , y2 - offset);     
             }
          } 

构造 函数

public Draw(Tour firstTour, Tour secondTour) {
           //First Tour
           this.firstTour = firstTour;
           this.distanceFirstTour = firstTour.getDistance();
           // second Tour
           this.secondTour = secondTour;
           this.distanceSecondTour = secondTour.getDistance();
    final int width = 400; // Breite des Fensters
    final int height = 450; // Hoehe des Fensters
            JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(width, height);
    f.add(this);
    f.setVisible(true);                  
            }

两个组件可能会更好。

然后,所有绘制都将相对于组件的 (0, 0) 完成。

如果您尝试在同一组件中进行两幅绘画,则第一幅画将相对于 (0, 0),第二幅画将相对于第一幅画的大小。

无论哪种情况,所有的绘画都应该在paintComponent()方法中完成。没有必要重写 paintChildren() 方法,因为没有子项。

此外,您需要覆盖每个组件的getPreferredSize()方法,以便布局管理器知道如何定位每个组件。然后,您可以使用 FlowLayout 将两个组件添加到面板中,这些组件将一个接一个地放置。

相关内容

  • 没有找到相关文章

最新更新