#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. в вопросе конкретно спрашивается, как это сделать, не помещая его в ярлык, поэтому ваш ответ лучше всего использовать в качестве комментария, а не ответа.