Используя Swing, я хочу нарисовать пару точек - PullRequest
2 голосов
/ 04 октября 2009

... в изображении и сделайте некоторый расчет по их [x y] координатам.

Моей первой идеей было использовать изображение в качестве фона JPanel, а затем зарегистрировать точки, но я не уверен, что будет способ пометить их на JPanel. Есть также библиотека чертежей, с которой я не знаком, но я не уверен, что смогу объединить их с Swing.

Можете ли вы назвать мне пакеты / классы, которые я могу использовать для выполнения задачи? Ссылки на код, который уже делает это, также приветствуются.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 04 октября 2009

Проблема здесь в три раза:

  1. Должен быть способ отображения фонового изображения.
  2. Нужно уметь найти точку, в которой была нажата мышь.
  3. Должен быть способ нарисовать точку на панели.

Одним из способов достижения указанных выше пунктов является подкласс JPanel и предоставление этих функциональных возможностей.

1. Отображение фонового изображения на панели.

Во-первых, поскольку JPanel не имеет способа отображения фонового изображения по умолчанию, должен быть способ удержать изображение в JPanel, а затем нарисовать его на самой панели, что может быть выполняется методом paintComponent.

Один из способов добиться этого - иметь в классе поле, которое содержит Image для рисования:

class MyPanel extends JPanel {
    // Background image. Initialize appropriately.
    Image backgroundImage;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw background image each time the panel is repainted.
        g.drawImage(backgroundImage, 0, 0, null);
    }
}

Объект Graphics в paintComponent связан с MyPanel и может использоваться для выполнения графических операций.

2. Нахождение точки, в которой была нажата мышь.

Во-вторых, чтобы получить точку, в которой была нажата мышь, можно присвоить MouseListener для MyPanel. В следующем примере анонимный внутренний класс, расширяющий MouseAdapter, используется для минимизации написания дополнительного кода:

class MyPanel extends JPanel {
    // Background image. Initialize appropriately.
    Image backgroundImage;

    public MyPanel() {
         // Add a MouseListener which processes mouse clicks.
         this.addMouseListener(new MouseAdapter() {
             public void mouseClicked(MouseEvent e) {
                 // Process mouse-click.
             }
         })
    }

    // paintComponents method here.
}

Обработка, которая должна выполняться при щелчке мыши, может быть включена в метод mouseClicked.

3. Как нарисовать точку на панели.

В-третьих, чтобы найти точку, в которой была нажата мышь, ее можно получить из объекта MouseEvent, переданного методом mouseClicked :

class MyPanel extends JPanel {
    // Background image. Initialize appropriately.
    Image backgroundImage;
    Point pointClicked;

    public MyPanel() {
         // Add a MouseListener which processes mouse clicks.
         this.addMouseListener(new MouseAdapter() {
             public void mouseClicked(MouseEvent e) {
                 // Retrieve the point at which the mouse was clicked.
                 pointClicked = e.getPoint();

                 // Repaint the panel.
                 this.repaint();
             }
         })
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw background image each time the panel is repainted.
        g.drawImage(backgroundImage, 0, 0, null);

        // Draw a little square at where the mouse was clicked.
        g.fillRect(pointClicked.x, pointClicked.y, 1, 1);
    }
}

Хотя приведенный выше код не проверен, он должен быть отправной точкой.

Например, если нужно рисовать несколько точек, возможно, для хранения точек есть List<Point>, и каждый Point в методе paintComponents может быть выполнен.

Если при щелчке мыши необходимо выполнить дополнительную обработку, можно добавить дополнительный код к методу mouseClicked.

Дополнительные ресурсы:

Спасибо zedoo за указание в комментариях, что при переопределении метода paintComponent следует выполнять вызов super.paintComponent.

1 голос
/ 04 октября 2009

Панель Background предлагает несколько советов о том, как отображать фоновое изображение в зависимости от ваших требований.

Пользовательские подходы к рисованию затем дает некоторые идеи о том, как сделать пользовательский рисунок, если вам нужно добавить пользовательские точки на изображение.

1 голос
/ 04 октября 2009

Вы также можете найти это полезным, если вам нужен тяжеловесный компонент (AWT), В этом руководстве объясняется, как расширить класс Canvas для рисования.

1 голос
/ 04 октября 2009

Создайте подкласс JPanel и переопределите метод paintComponent:

public void paintComponent(Graphics g) {
    super.paintComponent(g);

}

В методе вы можете использовать методы переданного ему объекта Graphics. Этот метод будет вызываться каждый раз, когда возникает необходимость перерисовать панель, поэтому вам нужно сохранить свои точки в массиве, а затем прочитать и нарисовать каждую из них в своем paintComponent.

...