Рисование для отображения местоположения объекта параметра - PullRequest
0 голосов
/ 07 декабря 2010

Мы пытаемся нарисовать круговые объекты в разных координатах xy на фоновом изображении карты мира.У нас есть класс Territory, который принимает два целых числа для координат x и y.

Territory(String name, int x , int y)...

У нас также есть класс панели (расширяет JPanel), который рисует фоновое изображение на JPanel, используя переопределенный метод paintComponent.Однако мы не можем найти способ передать значения координат и другие атрибуты из другого класса, не нарушая переопределение, или если есть другой способ рисовать на той же панели, что и фоновое изображение.

Это нашкод для метода paintComponent, вызываемого в классе панели.

 protected void paintComponent(Graphics g){
  super.paintComponent(g);
         if (image != null)
 g.drawImage(image, 0,0,this.getWidth(),this.getHeight(),this);

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

Код ниже создаст это изображение:

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);
    }
}
2 голосов
/ 07 декабря 2010

Настраиваемое рисование должно выполняться внутри одного и того же метода paintComponent (). Поэтому в основном панель, которая рисует фон, также должна иметь метод, подобный addCircleToPaint (). Информация о круге должна храниться в ArrayList (или что-то в этом роде). Затем в методе paintComponent вы рисуете изображение, а затем перебираете ArrayList и рисуете круги.

Или вы можете использовать совершенно другой подход и использовать Layered Panes . Используйте один слой для фона и один слой для кругов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...