当前位置: 首页 > 知识库问答 >
问题:

拖动两个图像并将其放在同一 JFrame 中的两个不同的 JButton 中

仉英朗
2023-03-14

我有一个代码,其中我必须从我的桌面拖动两个图像,并把它放在两个可拖动按钮的框架。按钮已经做在框架上了。但是在拖动图像时,只能拖动到一个按钮上。图像不会被拖到另一个。我创建了一个< code>DragListener类,其中拖动方法占主导地位,还创建了一个主类< code > draginiallistener ,其中我传递了类< code>DragButton的对象,这样就创建了两个可拖动的按钮。我已经尝试了我能想到的一切,创建了两个< code>DragListener类,传递了不同的方法,但是图像只能在一个按钮中拖动。我希望这两个按钮都能够容纳图像。请帮我一下。这是我到目前为止编写的代码:

这是主类

public class DragInitialListener  extends javax.swing.JFrame {

private volatile int draggedAtX, draggedAtY;

public DragInitialListener() {

initComponents();
Droptargets();
Droptarget();
}

public void Droptarget()
{

DragListener d;
DragButton db = new DragButton();
db.setSize(170,140);
d= new DragListener(db);

DropTarget drop = new DropTarget(this,d);


this.getContentPane().add(db);
}

 public void Droptargets()
{

   DragListener dd;
    DragButton db1 = new DragButton();
   db1.setSize(170,140);


    dd= new DragListener(db1);

    DropTarget drop1 = new DropTarget(this,dd);



    this.getContentPane().add(db1);



   }

// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        


 public static void main(String args[]) {


    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {

            new DragInitialListener().setVisible(true);

        }
    });
  }

// Variables declaration - do not modify                     
// End of variables declaration                   

   }

//这是DragListener类

    public class DragListener extends JButton implements DropTargetListener     
    {

     JButton imagebutton = new JButton();
     //  JButton imagebutton1 = new JButton();

     private volatile int draggedAtX, draggedAtY;


      DragListener(JButton image) {

       imagebutton=image;

        }


         @Override
         public void dragEnter(DropTargetDragEvent dtde) {

          }

          @Override
           public void dragOver(DropTargetDragEvent dtde) {

            }

           @Override
            public void dropActionChanged(DropTargetDragEvent dtde) {


             }

            @Override
             public void dragExit(DropTargetEvent dte) {

             }

             @Override
             public void drop(DropTargetDropEvent ev) {

              ev.acceptDrop(DnDConstants.ACTION_COPY);
              Transferable t = ev.getTransferable();
               //DropTarget test = (DropTarget) ev.getSource();

                DataFlavor[] df= t.getTransferDataFlavors();
                 for(DataFlavor f:df)
               {
                try
                 {
                  if(f.isFlavorJavaFileListType())
                  {
                   List<File> files =(List<File>) t.getTransferData(f);

                    for(File file : files)
                     {
                       displayImage(file.getPath());
                        }
                      }
                       }
                       catch(Exception ex)
                          {
                           JOptionPane.showMessageDialog(null, ex);
                           }
                            }
                              }
                          private void displayImage(String path)
                         {
                         BufferedImage img = null;
                          try
                         {
                          img =ImageIO.read(new File(path));

                            }
                            catch(Exception e)
                            {

                              }
                            ImageIcon icon = new ImageIcon(img);
                            imagebutton.setIcon(icon);


                                  }



                               }

共有1个答案

顾昌翰
2023-03-14

从简单开始,一键工作,如果你能得到一个工作,你可以得到100个工作

这是一个非常简单的示例,它使用了传输API,因为您真正关心的是拖放而不是拖动

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        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 JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            JButton btn = new JButton("Drop here");
            btn.setVerticalTextPosition(JButton.BOTTOM);
            btn.setHorizontalTextPosition(JButton.CENTER);
            btn.setTransferHandler(new ImageTransferHandler());
            add(btn);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }

    public static class ImageTransferHandler extends TransferHandler {

        public static final DataFlavor[] SUPPORTED_DATA_FLAVORS = new DataFlavor[]{
            DataFlavor.javaFileListFlavor,
            DataFlavor.imageFlavor
        };

        @Override
        public boolean canImport(TransferHandler.TransferSupport support) {
            boolean canImport = false;
            for (DataFlavor flavor : SUPPORTED_DATA_FLAVORS) {
                if (support.isDataFlavorSupported(flavor)) {
                    canImport = true;
                    break;
                }
            }
            return canImport;
        }

        @Override
        public boolean importData(TransferHandler.TransferSupport support) {
            boolean accept = false;
            if (canImport(support)) {
                try {
                    Transferable t = support.getTransferable();
                    Component component = support.getComponent();
                    if (component instanceof JButton) {
                        Image image = null;
                        if (support.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                            image = (Image) t.getTransferData(DataFlavor.imageFlavor);
                        } else if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                            List files = (List) t.getTransferData(DataFlavor.javaFileListFlavor);
                            if (files.size() > 0) {
                                image = ImageIO.read((File) files.get(0));
                            }
                        }
                        ImageIcon icon = null;
                        if (image != null) {
                            icon = new ImageIcon(image);
                        }
                        ((JButton) component).setIcon(icon);
                        accept = true;
                    }
                } catch (Exception exp) {
                    exp.printStackTrace();
                }
            }
            return accept;
        }
    }
}

因此,只需更改布局并使用

public TestPane() {
    setLayout(new GridLayout(5, 5));
    for (int index = 0; index < 5 * 5; index++) {
        JButton btn = new JButton("Drop here");
        btn.setVerticalTextPosition(JButton.BOTTOM);
        btn.setHorizontalTextPosition(JButton.CENTER);
        btn.setTransferHandler(new ImageTransferHandler());
        add(btn);
    }
}

我能够实现...

所以显然我可能误解了这个问题,不是第一次了。从我得到的解释来看,你可能想要拖动多个图像并把它们应用到按钮上。令人惊讶的是,这个过程并没有改变太多。

在本例中,我将< code>TransferHandler应用于< code>JPanel而不是按钮,并向它提供了我想要更新的按钮。您可以很容易地更新它,使其具有可变数量的按钮,但是我已经从两个按钮开始了。

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.io.File;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        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 JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());

            JButton left = makeButton("Left");
            JButton right = makeButton("Right");

            add(left);
            add(right);

            setTransferHandler(new ImageTransferHandler(left, right));
        }

        protected JButton makeButton(String text) {
            JButton btn = new JButton(text);
            btn.setVerticalTextPosition(JButton.BOTTOM);
            btn.setHorizontalTextPosition(JButton.CENTER);
            return btn;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

    }

    public static class ImageTransferHandler extends TransferHandler {

        public static final DataFlavor[] SUPPORTED_DATA_FLAVORS = new DataFlavor[]{
            DataFlavor.javaFileListFlavor,};

        private JButton left, right;

        public ImageTransferHandler(JButton left, JButton right) {
            this.left = left;
            this.right = right;
        }

        @Override
        public boolean canImport(TransferHandler.TransferSupport support) {
            boolean canImport = false;
            for (DataFlavor flavor : SUPPORTED_DATA_FLAVORS) {
                if (support.isDataFlavorSupported(flavor)) {
                    canImport = true;
                    break;
                }
            }
            return canImport;
        }

        @Override
        public boolean importData(TransferHandler.TransferSupport support) {
            boolean accept = false;
            if (canImport(support)) {
                try {
                    Transferable t = support.getTransferable();
                    Image image = null;
                    if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                        List files = (List) t.getTransferData(DataFlavor.javaFileListFlavor);
                        JButton buttons[] = new JButton[]{left, right};
                        for (int index = 0; index < Math.min(files.size(), 2); index++) {
                            if (files.size() > 0) {
                                image = ImageIO.read((File) files.get(index));
                                ImageIcon icon = null;
                                if (image != null) {
                                    icon = new ImageIcon(image);
                                }
                                buttons[index].setIcon(icon);
                            }
                        }
                        accept = true;
                    }
                } catch (Exception exp) {
                    exp.printStackTrace();
                }
            }
            return accept;
        }
    }
}

现在,你需要自己定义一些规则,例如,当用户只拖动一张图片时会发生什么?你是每次都把它应用到第一个按钮上(像我一样),还是尝试找到没有图像的按钮并更新它?如果所有的按钮都有图像会怎么样?那它去哪了?

你拒绝超过2张图片的拖拽吗?

 类似资料:
  • 问题内容: 我运行foo.com。我在foo.com中有两个不同的应用程序:一个是foo.com/bar,另一个是foo.com/example。我使用会话来跟踪有关用户登录的信息,但是如果用户从foo.com/bar转到foo.com/example,则foo.com/example会看到用户从foo.com/启动的会话并使用该信息。我的问题是,如何同时为每个目录进行两个不同的会话? 问题答案:

  • 我现在正在进行战舰项目。我创建了两个面板,我将它们放在一个框架中。第一个面板是按钮网格,第二个面板由可拖动的船只图像组成。我想要的只是,当我将图像拖到某个按钮中时,它会出现在该按钮上。换句话说,我只是想通过将图像拖到JButton中来简单地添加图像。这是完整的代码: 希望有人能帮助我:)

  • 问题内容: 我正在制作一个有两个UIImageViews的应用程序。在每个图像视图中,用户需要能够输入不同的图像。这是我到目前为止的代码。 最终为每个不同的图像视图选择相同的图像。我希望能够选择两张单独的照片,每个视图一张。谢谢您的帮助。 问题答案: 您可以为每个按钮设置不同的标签,然后根据按钮的标签更新一个imageView或另一个。您只需要一个UIImagePickerController:

  • 我正在做一个NFC应用程序,想知道这种情况是否可能: 比如说,我在一个项目中有两个NFC标签和两个活动。NFC A是通过在NFC A中编写MIME类型来打开活动A的 在项目的清单文件中,活动A有以下意图过滤器: 所以,这很好用。我将添加另一个NFC标签和另一个活动。NFC B是为了开放活动B而编写的 现在,我应该如何将MIME类型写入NFC B并为活动B设置意图过滤器?考虑到活动A和活动B都在一个

  • 问题内容: public class Board extends JFrame { public void bd() { 我的代码遇到了一些麻烦 当我添加骑士图像时,背景图像将消失并且仅出现骑士图像。我如何使图像重叠或使背景图像像背景一样工作 问题答案: JLabel background1 = new JLabel(new ImageIcon(“background.png”)); JLabel

  • 问题内容: 我试图将两个图像并排居中,但由于某种原因,它始终将图像显示在彼此下方。有谁知道我如何才能使他们居中并排在一起? 谢谢! HTML代码 CSS代码 问题答案: 尝试改变 至 HTML