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

如何将图像放入JInternalFrame?

盛骏祥
2023-03-14

我创建了一个可以将图像导入标签的Swing应用程序,但我想做的是将导入的图像放入一个内部框架中,该框架将在图像删除后创建。

  1. 将图像放入Java应用程序
  2. 创建一个内部框架
  3. 使图像出现在内部框架中,而不是标签出现在JFrame中
public class Test{
    public static void main(String[] args) {               
                JFrame f = new JFrame("Testing");
                JLabel l = new JLabel("Drop here");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(600, 600);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
                f.add(l);
                l.setHorizontalAlignment(JLabel.CENTER);
                
           l.setTransferHandler(new TransferHandler() {         
            private static final long serialVersionUID = 1L;
        public static final DataFlavor[] SUPPORTED_DATA_FLAVORS = new DataFlavor[]{
            DataFlavor.javaFileListFlavor,
            DataFlavor.imageFlavor
        };
        @Override
        public boolean canImport(TransferHandler.TransferSupport support) {
            System.out.println("1");
            for (DataFlavor flavor : SUPPORTED_DATA_FLAVORS) {
                if (!support.isDataFlavorSupported(flavor)) {
                  return  true;
                    
                }
            }
            return true;
        }
        @Override
        public boolean importData(TransferHandler.TransferSupport support) {
            System.out.println("2");
            new Test();
            JInternalFrame  mb = new JInternalFrame("Frame title4", true, true, true);
            JLabel la = new JLabel("here");
            mb.setSize(400, 300);
            l.add(mb);
            la.setHorizontalAlignment(JLabel.CENTER);
            mb.add(la);
            mb.setVisible(true);  
      
                if (canImport(support)) {
                    try {
                        Transferable t = support.getTransferable();
                        Component component = support.getComponent();
                        if (component instanceof JLabel) {
                            Image image = null;
                            if (support.isDataFlavorSupported(DataFlavor.imageFlavor)) {
                                image = (Image) t.getTransferData(DataFlavor.imageFlavor);
                            } else if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                                @SuppressWarnings("rawtypes")
                                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);
                            }
                            ((JLabel) component).setIcon(icon);
                            return true;
                        }
                    } catch (Exception exp) {
                        exp.printStackTrace();
                    }
                }
                return true;
            }
        });
}}


共有1个答案

贾骏
2023-03-14

在框架、面板、标签、内部框架上放置图像实际上是一回事。对我来说,我会专注于公分母,让事情变得更简单。对我来说,这意味着一个JPanel。

JPanel可以添加到框架、内部框架和另一个面板/容器中,并可以决定如何显示跌落,在这种情况下,它可以使用JLabel来显示图像。

因此,基于如何在java中从目录拖放文件,以及在JFrame上拖放特定扩展名的java文件

你可以做一些像。。。

import java.awt.Color;
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.Point;
import java.awt.Rectangle;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.TooManyListenersException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

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

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JInternalFrame littleFrame = new JInternalFrame("Hello", true, true, true, true);
                littleFrame.add(new DropPane());
                littleFrame.pack();
                littleFrame.setVisible(true);

                JDesktopPane desktopPane = new JDesktopPane();
                desktopPane.add(littleFrame);
                desktopPane.setPreferredSize(new Dimension(400, 400));

                JFrame frame = new JFrame();
                frame.add(desktopPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DropPane extends JPanel {

        private DropTarget dropTarget;
        private DropTargetHandler dropTargetHandler;
        private Point dragPoint;
        private boolean dragAccepted;

        private boolean dragOver = false;
        private JLabel message;

        public DropPane() {
            setLayout(new GridBagLayout());
            message = new JLabel();
            add(message);

        }

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

        protected DropTarget getMyDropTarget() {
            if (dropTarget == null) {
                dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, null);
            }
            return dropTarget;
        }

        protected DropTargetHandler getDropTargetHandler() {
            if (dropTargetHandler == null) {
                dropTargetHandler = new DropTargetHandler();
            }
            return dropTargetHandler;
        }

        @Override
        public void addNotify() {
            super.addNotify();
            try {
                getMyDropTarget().addDropTargetListener(getDropTargetHandler());
            } catch (TooManyListenersException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public void removeNotify() {
            super.removeNotify();
            getMyDropTarget().removeDropTargetListener(getDropTargetHandler());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (dragOver) {
                Graphics2D g2d = (Graphics2D) g.create();
                if (dragAccepted) {
                    g2d.setColor(new Color(0, 255, 0, 64));
                } else {
                    g2d.setColor(new Color(255, 0, 0, 64));
                }
                g2d.fill(new Rectangle(getWidth(), getHeight()));
                if (dragPoint != null) {
                    int x = dragPoint.x - 25;
                    int y = dragPoint.y - 25;
                    g2d.setColor(Color.BLACK);
                    g2d.drawRect(x, y, 50, 50);
                }
                g2d.dispose();
            }
        }

        protected void importedImage(final Image image) {
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    if (image == null) {
                        message.setIcon(null);
                    } else {
                        message.setIcon(new ImageIcon(image));
                    }
                }
            };
            SwingUtilities.invokeLater(run);
        }

        protected void importFailed(final String message) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JOptionPane.showMessageDialog(DropPane.this, message, "Error", JOptionPane.ERROR_MESSAGE);
                }
            });
        }

        protected class DropTargetHandler implements DropTargetListener {

            private String[] validExtenions = new String[]{
                ".png", ".jpeg", ".jpeg", "bmp", "gif"
            };

            protected boolean canAcceptFile(File file) {
                String name = file.getName().toLowerCase();
                for (String ext : validExtenions) {
                    if (name.endsWith(ext)) {
                        return true;
                    }
                }
                return false;
            }

            protected File acceptableFileFrom(Transferable transferable) throws UnsupportedFlavorException, IOException {
                Object transferData = transferable.getTransferData(DataFlavor.javaFileListFlavor);
                if (transferData == null) {
                    return null;
                }
                List fileList = (List) transferData;
                if (fileList.size() > 1) {
                    return null;
                }
                File file = (File) fileList.get(0);
                if (canAcceptFile(file)) {
                    return file;
                }
                return null;
            }

            protected boolean canAcceptDrag(Transferable transferable) {
                if (transferable == null) {
                    return true;
                }
                try {
                    File file = acceptableFileFrom(transferable);
                    if (file == null) {
                        return true;
                    }
                } catch (UnsupportedFlavorException | IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    return false;
                }
                return false;
            }

            protected boolean acceptsDrag(DropTargetDragEvent dtde) {
                if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                    Transferable transferable = dtde.getTransferable();
                    if (DropTargetHandler.this.canAcceptDrag(transferable)) {
                        dtde.acceptDrag(DnDConstants.ACTION_COPY);
                        return true;
                    } else {
                        dtde.rejectDrag();
                        return false;
                    }
                } else {
                    dtde.rejectDrag();
                    return false;
                }
            }

            @Override
            public void dragEnter(DropTargetDragEvent dtde) {
                boolean accepted = acceptsDrag(dtde);
                SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation(), accepted));
                repaint();
            }

            @Override
            public void dragOver(DropTargetDragEvent dtde) {
                boolean accepted = acceptsDrag(dtde);
                SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation(), accepted));
                repaint();
            }

            @Override
            public void dropActionChanged(DropTargetDragEvent dtde) {
            }

            @Override
            public void dragExit(DropTargetEvent dte) {
                SwingUtilities.invokeLater(new DragUpdate(false, null, false));
                repaint();
            }

            @Override
            public void drop(DropTargetDropEvent dtde) {
                SwingUtilities.invokeLater(new DragUpdate(false, null, false));
                importedImage(null);
                if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                    dtde.acceptDrop(dtde.getDropAction());

                    try {
                        Transferable transferable = dtde.getTransferable();
                        File file = acceptableFileFrom(transferable);
                        if (file == null) {
                            importFailed("Not a supported image file");
                            dtde.dropComplete(false);
                        } else {
                            BufferedImage image = ImageIO.read(file);
                            dtde.dropComplete(true);
                            importedImage(image);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        dtde.dropComplete(false);
                        importFailed("Not a supported image format");
                    }
                } else {
                    dtde.rejectDrop();
                }
            }
        }

        public class DragUpdate implements Runnable {

            private boolean dragOver;
            private Point dragPoint;
            private boolean accepted;

            public DragUpdate(boolean dragOver, Point dragPoint, boolean accepted) {
                this.dragOver = dragOver;
                this.dragPoint = dragPoint;
                this.accepted = accepted;
            }

            @Override
            public void run() {
                DropPane.this.dragOver = dragOver;
                DropPane.this.dragPoint = dragPoint;
                DropPane.this.dragAccepted = accepted;
                DropPane.this.repaint();
            }
        }

    }
}

注意:在MacOS上,您无法预处理Transable数据。当我使用Windows 7时,它确实可以在Windows上运行,我无法验证它是否仍然有效。

 类似资料:
  • 问题内容: 我正在尝试做一些非常简单的事情。我想在表中特定行的列中放置一个图标。如果是文件夹,则显示文件夹图标。如果是文件,则显示文件图标。 有人知道如何在JavaFX 2中执行此操作吗? 我已经尝试了很多事情,这似乎应该很简单,或者至少是某个地方的例子。 问题答案: 好吧,我有一个巨大的假时刻。原来我的图片网址路径错误。 我确实找到了一个网站,该网站提供了为表添加元素的绝佳示例。这帮助我了解了一

  • 我希望将一个图像从我的桌面拖放到我的JPanel/Jframe上,然后能够将该图像存储到一个BufferedImage对象中,并对其执行id喜欢的操作 有没有办法用MouseListener做到这一点? 这是一个虚构的完美世界的例子,我可以在其中做到这一点 我希望你能明白。不是在寻找超复杂的东西。我是个笨蛋,尽量简单谢谢:)

  • 问题内容: 有什么办法可以将整个对象放到像这样的对象中: 而不是传递像这样的键值对: 问题答案: 我已经在Map接口方法上进行了搜索,但是没有方法接受一个条目并将其放入地图中。因此,我自己使用一点继承和Java 8接口来实现它。 的接口仅仅是一个扩展的接口通过添加一种以上的方法,该接口。除了仅定义方法外,还对默认实现进行了编码。这样做,我们现在可以通过定义一个新的实现接口的类并扩展我们选择的map

  • 我在下面声明std: map: 但是我有很多错误,比如: 错误16错误C2676:二进制' 我做错了什么?

  • 在这里,我正试图将整个图像作为卡片视图的背景。但如图所示,它占用了一些空间。我尝试了和以及其他方法,但它没有响应。在附加的图像中,紫色表示占用的空空间。我需要的空间需要占用与背景图像。这是我的代码。 这是我的代码输出的图像

  • 问题内容: 我试图将图像放入带有Java的Excel单元格中,但没有成功,这是我正在使用的代码,但是我唯一要做的就是将图像放入excel工作表中,而不放在指定的单元格中 问题答案: 您已经在做的是将锚定图像定位到左上方的单元格()。然后,您已经将图像调整为原始大小。 如果图像适合该单元格,则必须使用左上单元格 和 右下单元格创建锚点。而且,请勿将图像调整为原始大小。 例: 如果从程序行中删除注释符