добавление прослушивателя действий к изображению

#java #swing

#java #swing

Вопрос:

Я вставляю изображение в JPanel . Я пишу этот код.

 public void paint(Graphics g)
{

    img1=getToolkit().getImage("/Users/Boaz/Desktop/Piece.png");
    g.drawImage(img1, 200, 200,null);

}
  

Я хочу добавить прослушиватель действий к этому изображению, но у него нет addActionListener() метода. Как я могу это сделать, не помещая изображение в кнопку или метку?

Комментарии:

1. 1) Для рисования изображения JComponent — это все, что нужно. 2) Для JComponent или JPanel переопределите paintComponent(Graphics) вместо paint(Graphics) 3) Не пытайтесь загружать изображения в метод paint. Загрузите его в init() или во время построения и сохраните как атрибут уровня класса. 4) Для Toolkit метода загрузки изображения требуется MediaTracker . Используйте ImageIO.read(File) для способа гарантировать загрузку изображения. 5) Замените null на this в drawImage() методе.

Ответ №1:

Есть несколько вариантов.

Используйте MouseListener непосредственно в JPanel

Простым, но грязным способом было бы добавить MouseListener непосредственно к JPanel , в котором вы переопределили paintComponent метод, и реализовать mouseClicked метод, который проверяет, была ли нажата область, в которой существует изображение.

Примером может быть что-то вроде:

 class ImageShowingPanel extends JPanel {

  // The image to display
  private Image img;

  // The MouseListener that handles the click, etc.
  private MouseListener listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
      // Do what should be done when the image is clicked.
      // You'll need to implement some checks to see that the region where
      // the click occurred is within the bounds of the `img`
    }
  }

  // Instantiate the panel and perform initialization
  ImageShowingPanel() {
    addMouseListener(listener);
    img = ... // Load the image.
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }
}
  

Примечание: ActionListener Не может быть добавлено в a JPanel , поскольку JPanel само a не позволяет создавать то, что считается «действиями».

Создайте JComponent для отображения изображения и добавьте MouseListener

Лучшим способом было бы создать новый подкласс JComponent , единственной целью которого является отображение изображения. JComponent Размер должен соответствовать размеру изображения, чтобы щелчок по любой части JComponent можно было считать щелчком по изображению. Опять же, создайте MouseListener в JComponent , чтобы зафиксировать щелчок.

 class ImageShowingComponent extends JComponent {

  // The image to display
  private Image img;

  // The MouseListener that handles the click, etc.
  private MouseListener listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
      // Do what should be done when the image is clicked.
    }
  }

  // Instantiate the panel and perform initialization
  ImageShowingComponent() {
    addMouseListener(listener);
    img = ... // Load the image.
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }

  // This method override will tell the LayoutManager how large this component
  // should be. We'll want to make this component the same size as the `img`.
  public Dimension getPreferredSize() {
    return new Dimension(img.getWidth(), img.getHeight());
  }
}
  

Комментарии:

1. Судя по истории @user650679, похоже, ваш ответ не будет подтвержден / принят в ближайшем будущем :). Хотя мой голос 1.

2. @Favonius: Надеюсь, этот ответ может помочь и другим в будущем. Спасибо за положительный отзыв 🙂

3. ваш код не соответствует вашему описанию (к счастью 🙂 а) он корректно переопределяет paintComponent (в отличие от paint, указанного в первом примере) б) он корректно использует MouseListener (в отличие от заявленного реализованного)

4. @kleopatra Спасибо, что указали на несоответствие между описанием и кодом. Прошло некоторое время, но я внес некоторые изменения для решения проблемы. 🙂

5. Я хочу добавить несколько изображений на экран и сделать каждое из них clickable..so Мне пришлось бы создавать столько J-компонентов?

Ответ №2:

Самый простой способ — поместить изображение в JLabel. Когда вы используете программу, кажется, что это просто изображение, вы не можете определить его в JLabel. Затем просто добавьте MouseListener к JLabel.

Комментарии:

1. в вопросе конкретно спрашивается, как это сделать, не помещая его в ярлык, поэтому ваш ответ лучше всего использовать в качестве комментария, а не ответа.