【问题标题】:How can I drag images with the mouse cursor in Java GUI?如何在 Java GUI 中使用鼠标光标拖动图像?
【发布时间】:2015-03-10 23:59:59
【问题描述】:

// 我的代码调用了一个目录中的 n 个图像以放置在 JPanel 上

 public void imageAdder(int n, String name){
    BufferedImage myPic = null;
    for (int i = 0; i <= n; i++){
        try {
        myPic = ImageIO.read(new File("Images/" + name + i + ".jpg"));
        } catch (Exception e){
        System.out.println("no file man cmon");
        }
        JLabel picLabel = new JLabel(new ImageIcon(myPic));
      //  picLabel.setBounds(mouseX, mouseY, 100, 50);
      //  picLabel.addMouseMotionListener(this);
      //  picLabel.addMouseListener(this);
        canvas.add(picLabel);
    }}

我了解了 DragSource 类以及如何有一种方法可以拖动图像类型的东西,但我不确定这是否适用于我的代码。如果想用鼠标随意拖动图片怎么办?

【问题讨论】:

    标签: java image user-interface drag imageicon


    【解决方案1】:

    查看 Java Swing 中的自定义类,可能有用的链接可以帮助您入门:

    Java2s - DragandDropSupportforImages

    DragImage.javaDropImage.javaDragImageEvent.java

    【讨论】:

      【解决方案2】:

      您可以通过多种方式实现此目的...例如,您可以使用自定义绘画自己绘制单个图像。每次按下/拖动鼠标时,您都需要计算拖动的是哪个图像。

      一个稍微简单的解决方案可能是使用JLayeredPane 并继续使用JLabels 来渲染图像,然后您可以使用MouseListenerMouseMoitionListener 来检测何时按下和/或拖动标签并相应地更新它的位置......

      请参阅How to Write a Mouse ListenerHow to Use Layered Panes 了解更多详情。

      import java.awt.Component;
      import java.awt.Dimension;
      import java.awt.EventQueue;
      import java.awt.Point;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      import java.awt.image.BufferedImage;
      import java.io.File;
      import java.io.FileFilter;
      import java.io.IOException;
      import javax.imageio.ImageIO;
      import javax.swing.ImageIcon;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JLayeredPane;
      import javax.swing.UIManager;
      import javax.swing.UnsupportedLookAndFeelException;
      
      public class TestDrag {
      
          public static void main(String[] args) {
              new TestDrag();
          }
      
          public TestDrag() {
              EventQueue.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                          ex.printStackTrace();
                      }
      
                      JFrame frame = new JFrame("Testing");
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.add(new TestPane());
                      frame.pack();
                      frame.setLocationRelativeTo(null);
                      frame.setVisible(true);
                  }
              });
          }
      
          public class TestPane extends JLayeredPane {
      
              public TestPane() {
                  File[] images = new File("C:\\hold\\thumbnails").listFiles(new FileFilter() {
                      @Override
                      public boolean accept(File pathname) {
                          String name = pathname.getName().toLowerCase();
                          return name.endsWith(".png") || 
                                          name.endsWith(".jpg") || 
                                          name.endsWith(".bmp") ||
                                          name.endsWith(".gif");
                      }
                  });
      
                  int x = 0;
                  int y = 0;
                  for (File imgFile : images) {
      
                      try {
                          BufferedImage img = ImageIO.read(imgFile);
                          JLabel label = new JLabel(new ImageIcon(img));
                          label.setSize(label.getPreferredSize());
                          label.setLocation(x, y);
                          MouseHandler mh  = new MouseHandler();
                          label.addMouseListener(mh);
                          label.addMouseMotionListener(mh);
                          add(label);
                          x += 20;
                          y += 20;
                      } catch (IOException exp) {
                          exp.printStackTrace();
                      }
      
                  }
      
              }
      
              @Override
              public Dimension getPreferredSize() {
                  return new Dimension(800, 800);
              }
      
              public class MouseHandler extends MouseAdapter {
      
                  private Point offset;
      
                  @Override
                  public void mousePressed(MouseEvent e) {
                      JLabel label = (JLabel) e.getComponent();
                      moveToFront(label);
                      offset = e.getPoint();
                  }
      
                  @Override
                  public void mouseDragged(MouseEvent e) {
                      int x = e.getPoint().x - offset.x;
                      int y = e.getPoint().y - offset.y;
                      Component component = e.getComponent();
                      Point location = component.getLocation();
                      location.x += x;
                      location.y += y;
                      component.setLocation(location);
                  }
      
              }
      
          }
      
      }
      

      【讨论】:

      • 您好,谢谢您的回复!我对 java 和面向对象的语言还是很陌生,所以我想花几天时间来理解你写的代码,看看它是否可以实现到我的游戏中。我会尽快告诉你进展如何,非常感谢你的帮助!我很感激。
      • 只有一种方式,我能想到的最快最简单的,希望对你有帮助
      • 嘿,这似乎是一个愚蠢的问题,但每个类都应该在一个单独的文件中,对吧?他们排列括号的方式让我认为它们应该在同一个文件中,因为类 testdrag 是代码中的最后一个括号。但有人告诉我,每个班级都应该有自己的文件。可以的话请告诉我。
      • 这是一个自包含的示例,因此它可以驻留在单个类中,但它不必,因为我使用事件源,MouseHandler 不需要包含在其中测试窗格。这些被称为内部类
      • 你的代码就像一个魅力!非常感谢!请问,如果我想将类分开到同一个目录中的不同文件中,会不会导致任何问题?我试过了,它无法识别“moveToFront”方法。自从内置了 movetofront 以来,您知道为什么会出现这种情况吗? (进口应该不是问题,我占了)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      相关资源
      最近更新 更多