Wenn ich eine Datei per Drag & Drop in den linken Editor ziehe, muss sie den linken Editor versorgen.
Wenn ich eine Datei per Drag & Drop in den rechten Editor ziehe, muss sie den rechten Editor füttern.
Hier ist mein Code, der in einer typischen Umgebung einwandfrei funktioniert:
Code: Select all
import java.awt.BorderLayout;
import java.awt.datatransfer.DataFlavor;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.WindowConstants;
public class JEditorPaneDNDDemo extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(JEditorPaneDNDDemo::new);
}
private final JEditorPane leftEditor;
private final JEditorPane rightEditor;
public JEditorPaneDNDDemo() {
super("JEditorPane DND Demo");
leftEditor = createEditor();
rightEditor = createEditor();
JScrollPane leftScroll = new JScrollPane(leftEditor);
JScrollPane rightScroll = new JScrollPane(rightEditor);
installDrop(leftEditor, Side.LEFT);
installDrop(rightEditor, Side.RIGHT);
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll, rightScroll);
split.setResizeWeight(0.5);
add(split, BorderLayout.CENTER);
setSize(900, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
private JEditorPane createEditor() {
JEditorPane editor = new JEditorPane();
editor.setDragEnabled(true);
return editor;
}
private enum Side { LEFT, RIGHT }
private void installDrop(JEditorPane editor, Side side) {
TransferHandler handler = new TransferHandler() {
@Override
public boolean canImport(TransferSupport support) {
System.out.println(side + " canImport called");
return support.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
}
@Override
public boolean importData(TransferSupport support) {
System.out.println(side + " importData called");
try {
@SuppressWarnings("unchecked")
List files = (List) support
.getTransferable()
.getTransferData(DataFlavor.javaFileListFlavor);
if (files.isEmpty()) {
return false;
}
File file = files.get(0);
String text = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
if (side == Side.LEFT) {
leftEditor.setText(text);
} else {
rightEditor.setText(text);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
};
editor.setTransferHandler(handler);
}
}
Die Betriebssystemumgebung ist Windows 10 22H2.
Eine interessante Sache ist, dass das Problem verschwindet, sobald die Anwendung mit launch4j in eine ausführbare Anwendung gepackt wird.
Ich habe eine Maven pom.xml verwendet, um sie zu packen:
Code: Select all
4.0.0
demo
jeditorpane-dnd-demo
1.0.0
JEditorPane DND Demo
UTF-8
25
JEditorPaneDNDDemo
${project.artifactId}
org.apache.maven.plugins
maven-compiler-plugin
3.14.1
${project.build.sourceEncoding}
${maven.compiler.source}
${maven.compiler.target}
org.apache.maven.plugins
maven-shade-plugin
3.6.1
shade
package
shade
false
${main.class}
com.akathist.maven.plugins.launch4j
launch4j-maven-plugin
2.7.0
wrap-with-launch4j
package
launch4j
gui
${project.build.directory}/${project.build.finalName}.jar
${project.build.directory}/${project.build.finalName}.exe
${main.class}
25
Code: Select all
set JAVA_HOME=C:\path\to\jdk-25.0.1
jeditorpane-dnd-demo.exe
Code: Select all
%JAVA_HOME%\bin\java -jar jeditorpane-dnd-demo.jar
Mobile version