绘画以筛选参数对象的位置

时间:2010-12-07 05:13:21

标签: java swing

我们正在尝试在世界地图的背景图像上的不同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);

2 个答案:

答案 0 :(得分:2)

自定义绘画应该在同一个paintComponent()方法中完成。所以基本上绘制背景的面板也应该有一个像addCircleToPaint()这样的方法。圆信息应存储在ArrayList(或类似的东西)中。然后在paintComponent方法中绘制图像,然后循环遍历ArrayList并绘制圆圈。

或者您可以使用完全不同的方法并使用Layered Panes。使用一个图层作为背景,一个图层作为圆圈。

答案 1 :(得分:2)

以下代码将生成此图片:

Test image

请注意,如果您想绘制真实地区,我会使用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);
    }
}