我们正在尝试在世界地图的背景图像上的不同x-y坐标位置上绘制圆形对象。我们有一个名为Territory的类,它为x和y坐标提供两个整数。
Territory(String name, int x , int y)...
我们还有一个面板类(扩展JPanel),它使用重写的paintComponent方法将背景图像绘制到JPanel上。但是,我们无法找到一种方法来传递来自另一个类的坐标值和其他属性,而不会破坏覆盖,或者如果有另一种方法在同一面板上绘制背景图像。
这是我们在面板类中调用的paintComponent方法的代码。
protected void paintComponent(Graphics g){
super.paintComponent(g);
if (image != null)
g.drawImage(image, 0,0,this.getWidth(),this.getHeight(),this);
答案 0 :(得分:2)
自定义绘画应该在同一个paintComponent()方法中完成。所以基本上绘制背景的面板也应该有一个像addCircleToPaint()这样的方法。圆信息应存储在ArrayList(或类似的东西)中。然后在paintComponent方法中绘制图像,然后循环遍历ArrayList并绘制圆圈。
或者您可以使用完全不同的方法并使用Layered Panes。使用一个图层作为背景,一个图层作为圆圈。
答案 1 :(得分:2)
以下代码将生成此图片:
请注意,如果您想绘制真实地区,我会使用Polygon类。
public class Test {
static class Territory {
String name;
int x, y;
public Territory(String name, int x, int y) {
this.name = name;
this.x = x;
this.y = y;
}
public void paint(Graphics g) {
g.drawString(name, x, y);
g.drawOval(x - 50, y - 50, 101, 101);
}
}
static class Map extends JComponent {
Image bgImage;
List<Territory> territories;
public Map(List<Territory> territories) throws Exception {
this.bgImage = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/Winkel-tripel-projection.jpg/800px-Winkel-tripel-projection.jpg"));
this.territories = territories;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bgImage, 0, 0, null);
g.setColor(Color.RED);
for (Territory territory : territories)
territory.paint(g);
}
}
public static void main(String... args) throws Exception {
JFrame frame = new JFrame("Test");
final int w = 800;
final int h = 400;
Random r = new Random(8208);
List<Territory> territories = new LinkedList<Territory>();
for (int i = 0; i < 10; i++)
territories.add(new Territory("" + i, r.nextInt(w), r.nextInt(h)));
frame.add(new Map(territories));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(w, h);
frame.setVisible(true);
}
}