Отображение изображения и захват щелчков мыши не работают одновременно - PullRequest
0 голосов
/ 23 марта 2019

Что я хочу сделать:

Я хочу написать небольшое приложение, которое может отображать изображение. Пользователь должен иметь возможность увеличивать и уменьшать изображение, перемещать его и отмечать точки на изображении. Далее я хочу проанализировать точки нажатия, но я еще не там.

Что у меня так далеко:

Чтобы отследить мою проблему, я написал MVCE:

Класс GUI для обработки JFrame (и других элементов UI позже):

import javax.swing.*;
import java.net.MalformedURLException;
import java.net.URL;

public class MCVE_GUI {

    public static void main(String[] args) throws MalformedURLException {
        MCVE_ZoomPane zp = new MCVE_ZoomPane(new URL("https://fiji.sc/site/logo.png"));

        JFrame f = new JFrame("PictureMeasurement");
        f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        f.setContentPane(zp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.revalidate();
        f.repaint();
        f.setVisible(true);
    }
}

ZoomPanel для обработки изображения и масштабирования:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;

class MCVE_ZoomPane extends JPanel implements MouseMotionListener {

    MCVE_ZoomPane(URL url){
        JLabel image = new JLabel();
        JScrollPane jsp = new JScrollPane(image);

        //image.setIcon(new ImageIcon(url)); // picture, no input
        //jsp.setPreferredSize(new Dimension(300,300)); //picture, no input
        jsp.setPreferredSize(image.getPreferredSize()); //depends on position of image.setIcon
        image.setIcon(new ImageIcon(url));  //no picture, input

        this.add(jsp);
        this.setPreferredSize(image.getPreferredSize());
        this.addMouseMotionListener(this);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
    }

    public void mouseDragged(MouseEvent e) {
        System.out.format("Dragged X:%d Y:%d\n",e.getX(), e.getY());
    }

    public void mouseMoved(MouseEvent e) {}
}

Проблема:

В зависимости от того, куда я положил image.setIcon(new ImageIcon(url)), я получаю либо отображаемое изображение, либо могу слушать щелчки мыши, но не оба одновременно. Если я установлю JScrollPane на фиксированный предпочтительный размер без вызова image.getPreferredSize(), я всегда получаю изображение, но без ввода.

1 Ответ

0 голосов
/ 23 марта 2019

Видимо я тупой.JScrollPane / JLabel покрывал JPanel, который был единственным компонентом, который имел MouseMotionListener.Решение состоит в том, чтобы добавить одну строку image.addMouseMotionListener(this);.

Я думал об этом и пробовал разные решения по крайней мере три часа.Это хобби-проект, поэтому нет времени, но чувак, я чувствую себя глупо сейчас.

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