Java Swing:在JComponent/JPanel中使多个图像可单击

Java Swing:在JComponent/JPanel中使多个图像可单击,java,swing,jpanel,bufferedimage,jcomponent,Java,Swing,Jpanel,Bufferedimage,Jcomponent,我想在JFrame中添加多个图像,并使每个图像都可以单击。由于监听器不能直接在Swing中的image上实现,所以我必须创建那些JComponent对象,并在这些组件上实现监听器 这种理解是正确的还是有更好的方法?有几种方法可以解决这个问题: 创建自己的类并将其扩展到JComponent class ClickableImage extends JComponent implements MouseListener { private BufferedImage img; //

我想在
JFrame
中添加多个图像,并使每个图像都可以单击。由于监听器不能直接在Swing中的image上实现,所以我必须创建那些
JComponent
对象,并在这些组件上实现监听器


这种理解是正确的还是有更好的方法?

有几种方法可以解决这个问题:

  • 创建自己的类并将其扩展到JComponent

    class ClickableImage extends JComponent implements MouseListener
    {
        private BufferedImage img;
    
        //Include all the overridden methods for MouseListener
        @Override public void mouseClicked(MouseEvent e){
            //To do upon clicking on image;
        }
    }
    
  • 您可以在JButton上设置图像。为这些JButton添加ActionListener

  • 对图像使用缓冲图像,通过鼠标光标位置检测单击该图像

    class ClikableImage extends Rectangle{
        private BufferedImage img;
        //You can include any other class members you need.
    
        public MyClickableImage(int x, int y, int width, int height){
            setBounds(x, y, width, height);
        } 
    }
    
  • 要检测对特定图像的单击,请遍历ClickableImage列表并检查该ClickableImage是否包含鼠标光标坐标

    //Within a MouseListener
    for(ClickableImage ci : list)
        if(ci.contains(e.getX(), e.getY()))
            clickedImage = ci;
    

    “有更好的方法吗?”一个
    ActionListener
    附加到许多按钮上,使用
    Event.getSource()
    来找出单击了哪个按钮(因此也就是哪个图像),或者一个
    JList
    来呈现所有图像。这里是..您可能还想看看JButton.setIcon(newImageIcon(…)…我还想使图像具有可伸缩性。我可以在按钮上实现mouselistener并更改鼠标事件上的按钮宽度吗?我还想使图像具有可伸缩性。我可以在按钮上实现mouselistener并更改鼠标事件上的按钮宽度吗?哪种方法更适合处理此问题?@RajTrivedi这两种方法对于可伸缩图像。在这两种情况下,您都需要重新绘制包含JButton的JPanel/JComponent。使用JButton的方法更容易,因为您可以使用可用的侦听器(如ActionListener)来检测单击,而不是手动遍历对象列表。