如何从同一类中的 2 个不同方法生成 2 个paintComponent
图形 g?
我有 2 个不同的数据(FirstTour
、secondTour
)通过我的构造函数传递,我想为每个巡回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 将两个组件添加到面板中,这些组件将一个接一个地放置。