我想编写一个可以显示图像的小型应用程序。用户必须能够放大和缩小图像,四处移动图像并在图像上标记点。再往下走,我想分析点击的点,但是我还没有。
为了追踪我的问题,我写了一个MVCE:
用于处理JFrame(以及以后的其他UI元素)的GUI类:
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()
设置为固定的首选大小,我总是会得到图片,但没有输入。
答案 0 :(得分:0)
显然我很傻。 JScrollPane / JLabel涵盖了JPanel,它是唯一具有MouseMotionListener的组件。解决方案是添加image.addMouseMotionListener(this);
的单行。
我至少考虑了三个小时并尝试了不同的解决方案。这是一个业余爱好项目,因此没有时间限制,但是我现在觉得自己很愚蠢。