Jak mogę użyć funkcji przeciągnij i upuść w programie Swing, aby uzyskać ścieżkę do pliku?
Mam JTextField w mojej aplikacji swing, która przechowuje ścieżkę pliku wybranego do użycia. Obecnie mam JFileChooser, który jest używany do wypełnienia tej wartości. Chciałbym jednak dodać możliwość przeciągania i upuszczania pliku na to pole JTextField i umieszczania ścieżki do tego pliku w polu JTextField, zamiast zawsze używać JFileChooser.
Jak można to zrobić?
5 answers
Na początku należy przyjrzeć się obsłudze Swing DragDrop . Po tym istnieje kilka małych sztuczek dla różnych systemów operacyjnych. Gdy już wszystko się ułoży, będziesz obsługiwał wywołanie zwrotne drop (). W tym callback będziesz chciał sprawdzić DataFlavor zbywalne.
Dla Windows możesz po prostu sprawdzić DataFlavor.isFlavorJavaFileListType () a następnie pobrać dane w ten sposób
List<File> dropppedFiles = (List<File>)transferable.getTransferData(DataFlavor.javaFileListFlavor)
Dla Linuksa (i prawdopodobnie Solarisa) DataFlavor jest nieco trudniejszy. Musisz stworzyć własny DataFlavor, A Typ zbywalny będzie inny
nixFileDataFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
String data = (String)transferable.getTransferData(nixFileDataFlavor);
for(StringTokenizer st = new StringTokenizer(data, "\r\n"); st.hasMoreTokens();)
{
String token = st.nextToken().trim();
if(token.startsWith("#") || token.isEmpty())
{
// comment line, by RFC 2483
continue;
}
try
{
File file = new File(new URI(token))
// store this somewhere
}
catch(...)
{
// do something good
....
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-01 13:18:58
Istnieje przykładowy program, który zawiera klasę, która może być używana do ułatwiania przeciągania i upuszczania plików i folderów:
Http://www.iharder.net/current/java/filedrop/
Testowałem to zarówno z Windows 7, jak i Ubuntu 10.10 i wydaje się, że działa dobrze w obu środowiskach.
Aby go użyć, dodaj coś takiego do kodu:
JPanel myPanel = new JPanel();
new FileDrop( myPanel, new FileDrop.Listener()
{ public void filesDropped( java.io.File[] files )
{
// handle file drop
...
} // end filesDropped
}); // end FileDrop.Listener
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-10 11:24:50
Jeśli nie chcesz spędzać zbyt dużo czasu na badaniu tego stosunkowo złożonego tematu, a jesteś w systemie Windows (lub korzystasz z Javy 7 lub nowszej), oto szybki przykład, jak zaakceptować upuszczone pliki z jtextarea jako cel upuszczania:
JTextArea myPanel = new JTextArea();
myPanel.setDropTarget(new DropTarget() {
public synchronized void drop(DropTargetDropEvent evt) {
try {
evt.acceptDrop(DnDConstants.ACTION_COPY);
List<File> droppedFiles = (List<File>)
evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
for (File file : droppedFiles) {
// process files
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 19:22:55
Wiem, że to stare pytanie, ale obecne odpowiedzi są trochę nieaktualne:
- od JDK 1.6 Klasa 'TransferHandler' powinna być używana z nowymi (nadpisanymi) metodami
- wsparcie dla Linuksa stało się o wiele lepsze, nie ma potrzeby niestandardowej obsługi
To działa na Linuksie (KDE5) i Windows 7:
final class FileDropHandler extends TransferHandler {
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
for (DataFlavor flavor : support.getDataFlavors()) {
if (flavor.isFlavorJavaFileListType()) {
return true;
}
}
return false;
}
@Override
@SuppressWarnings("unchecked")
public boolean importData(TransferHandler.TransferSupport support) {
if (!this.canImport(support))
return false;
List<File> files;
try {
files = (List<File>) support.getTransferable()
.getTransferData(DataFlavor.javaFileListFlavor);
} catch (UnsupportedFlavorException | IOException ex) {
// should never happen (or JDK is buggy)
return false;
}
for (File file: files) {
// do something...
}
return true;
}
}
Użyj go na dowolnym komponencie z
myComponent.setTransferHandler(new FileDropHandler());
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 15:54:11
To mi pasuje. Używam go tak (scala):
def onDrop(files: List[java.io.File]): Unit = { ... }
val lblDrop = new Label {
peer.setTransferHandler(new FileDropHandler(onDrop))
border = EtchedBorder
}
class FileDropHandler(val onDrop: List[java.io.File] => Unit) extends javax.swing.TransferHandler {
import javax.swing.JComponent
import java.awt.datatransfer.{Transferable, DataFlavor}
import java.net.URI
import java.io.File
val stdFileListFlavor = DataFlavor.javaFileListFlavor
val nixFileListFlavor = new DataFlavor("text/uri-list;class=java.lang.String")
override def canImport(comp: JComponent, flavors: Array[DataFlavor]): Boolean =
flavors.exists(flavor =>
(flavor == stdFileListFlavor) ||
(flavor == nixFileListFlavor)
)
override def importData(comp: JComponent, t: Transferable): Boolean = {
val flavors = t.getTransferDataFlavors()
val files = if (flavors.exists(_ == stdFileListFlavor)) {
val data = t.getTransferData(stdFileListFlavor)
importStdFileList( data )
} else if (flavors.exists(_ == nixFileListFlavor)) {
val data = t.getTransferData(nixFileListFlavor)
importNixFileList( data )
} else List()
onDrop( files )
!files.isEmpty
}
private def importStdFileList(data: Any): List[File] = {
data.asInstanceOf[List[File]] //XXX NOT TESTED
}
private def importNixFileList(data: Any): List[File] = {
def clean(rawLine: String): Option[String] = {
val line = rawLine.trim
if (line.length == 0 || line == "#") None
else Some(line)
}
def asURI(line: String): Option[URI] = {
try { Some(new URI(line)) }
catch { case e:Exception => println(e); None }
}
def asFile(uri: URI): Option[File] = {
try { Some(new File(uri)) }
catch { case e:Exception => println(e); None }
}
data.asInstanceOf[java.lang.String].split("\n")
.toList flatMap clean flatMap asURI flatMap asFile
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 21:29:09