我创建了一个可以将图像导入标签的Swing应用程序,但我想做的是将导入的图像放入一个内部框架中,该框架将在图像删除后创建。
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;
}
});
}}
在框架、面板、标签、内部框架上放置图像实际上是一回事。对我来说,我会专注于公分母,让事情变得更简单。对我来说,这意味着一个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工作表中,而不放在指定的单元格中 问题答案: 您已经在做的是将锚定图像定位到左上方的单元格()。然后,您已经将图像调整为原始大小。 如果图像适合该单元格,则必须使用左上单元格 和 右下单元格创建锚点。而且,请勿将图像调整为原始大小。 例: 如果从程序行中删除注释符