显示图像和捕获鼠标单击不能同时工作

时间:2019-03-23 11:57:00

标签: java image swing interactive

我想做什么:

我想编写一个可以显示图像的小型应用程序。用户必须能够放大和缩小图像,四处移动图像并在图像上标记点。再往下走,我想分析点击的点,但是我还没有。

到目前为止我所拥有的:

为了追踪我的问题,我写了一个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()设置为固定的首选大小,我总是会得到图片,但没有输入。

1 个答案:

答案 0 :(得分:0)

显然我很傻。 JScrollPane / JLabel涵盖了JPanel,它是唯一具有MouseMotionListener的组件。解决方案是添加image.addMouseMotionListener(this);的单行。

我至少考虑了三个小时并尝试了不同的解决方案。这是一个业余爱好项目,因此没有时间限制,但是我现在觉得自己很愚蠢。