Самым простым решением было бы использовать JLabel
и установить это свойство icon
. См. How to use labels для более подробной информации.
Если вы должны сами нарисовать изображение (например, хотите применить эффекты или выполнить анимацию в контейнере), то вам необходимо добавить MouseListener
в контейнер, который отображает изображение и проверит, есть ли событие мыши происходило в контексте изображения на основе его местоположения и размера.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ImageMouseListener {
public static void main(String[] args) {
new ImageMouseListener();
}
public ImageMouseListener() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ImagePane extends JPanel {
private BufferedImage img;
private Point imgPoint;
public ImagePane() {
try {
img = ImageIO.read(...);
imgPoint = new Point(100, 100);
} catch (IOException ex) {
ex.printStackTrace();
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (img != null && imgPoint != null) {
Point me = e.getPoint();
Rectangle bounds = new Rectangle(imgPoint, new Dimension(img.getWidth(), img.getHeight()));
if (bounds.contains(me)) {
System.out.println("I was clicked!");
}
}
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null && imgPoint != null) {
g.drawImage(img, imgPoint.x, imgPoint.y, this);
}
}
}
}
Взгляните на Performing Custom Painting и How to use Mouse Listeners для получения более подробной информации
Вы не можете, но вы можете добавить его в JLabel или контейнера, что изображение нарисовано, но вам нужно будет проверить если мышь воздействовала в пределах изображения на основании того, где она находится в контейнере. Взгляните на [Как использовать MouseListeners] (http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html) – MadProgrammer
дайте мне совет, пожалуйста, есть ли другие способы рисования изображения и переопределить onclick в теме ? без использования JLable или каких-либо проверок? – Ashot