Я пытаюсь реализовать перетаскивание внутри разделенной панели с двумя редакторами.
Когда я перетаскиваю файл в левый редактор, он должен передаваться левому редактору.
Когда я перетаскиваю файл в правый редактор, он должен передавать правый редактор.
Вот мой код, который отлично работает в типичной среде:
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);
}
}
Однако в корпоративной среде он ничего не делает. Я никогда не добираюсь до метода canImport. В чем может быть причина?
Средой ОС является Windows 10 22H2.
Одна интересная вещь, на которую следует обратить внимание: как только приложение упаковывается с помощью launch4j в исполняемое приложение, проблема исчезает.
Я использовал maven pom.xml для его упаковки:
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
Я собрал с помощью mvn install, а затем, после установки JAVA_HOME, запустил приложение и перетащил его успешно.
set JAVA_HOME=C:\path\to\jdk-25.0.1
jeditorpane-dnd-demo.exe
Перетаскивание также работает после запуска:
%JAVA_HOME%\bin\java -jar jeditorpane-dnd-demo.jar
Подробнее здесь: https://stackoverflow.com/questions/798 ... editorpane
Как перетащить в JEditorPane? ⇐ JAVA
Программисты JAVA общаются здесь
1767361751
Anonymous
Я пытаюсь реализовать перетаскивание внутри разделенной панели с двумя редакторами.
Когда я перетаскиваю файл в левый редактор, он должен передаваться левому редактору.
Когда я перетаскиваю файл в правый редактор, он должен передавать правый редактор.
Вот мой код, который отлично работает в типичной среде:
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);
}
}
Однако в корпоративной среде он ничего не делает. Я никогда не добираюсь до метода canImport. В чем может быть причина?
Средой ОС является Windows 10 22H2.
Одна интересная вещь, на которую следует обратить внимание: как только приложение упаковывается с помощью launch4j в исполняемое приложение, проблема исчезает.
Я использовал maven pom.xml для его упаковки:
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
Я собрал с помощью mvn install, а затем, после установки JAVA_HOME, запустил приложение и перетащил его успешно.
set JAVA_HOME=C:\path\to\jdk-25.0.1
jeditorpane-dnd-demo.exe
Перетаскивание также работает после запуска:
%JAVA_HOME%\bin\java -jar jeditorpane-dnd-demo.jar
Подробнее здесь: [url]https://stackoverflow.com/questions/79859074/how-do-i-drag-and-drop-into-a-jeditorpane[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия