Что я хочу сделать:
Я хочу написать небольшое приложение, которое может отображать изображение. Пользователь должен иметь возможность увеличивать и уменьшать изображение, перемещать его и отмечать точки на изображении. Далее я хочу проанализировать точки нажатия, но я еще не там.
Что у меня так далеко:
Чтобы отследить мою проблему, я написал 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()
, я всегда получаю изображение, но без ввода.