У меня есть файл класса Java с основным методом. В Windows я хотел бы иметь возможность перетаскивать файлы на значок на рабочем столе / короткий / и т. д., Который вызывал бы предоставление имен файлов моему основному методу. По сути, я хочу разрешить пользователям перетаскивать файлы при выполнении программы вместо того, чтобы вводить их в командной строке.
Есть предположения?




Добавление в Adiel A. Если вы создаете командный файл, который запускает ваше окно Java с помощью Swing. Вы бы попросили пользователя перетащить файлы в это окно. После этого вы сможете получить root-доступ через эти сброшенные файлы.
Я удалил свой пост, чтобы навести порядок. Это было недоразумением, потому что я плохо прочитал вопрос. Глупый я.
Чтобы использовать ответ daub815, в Windows вы можете использовать командный файл для передачи
аргументы другой команды. В этом случае мы будем использовать программу запуска java, чтобы
запустите свой класс методом main.
Я быстро поискал в Google, как написать командный файл, чтобы принимать несколько аргументов, и нашел страницу с командным файлом для передачи аргументов другой команде. Адаптация от пример, вот что вы можете сделать:
@ECHO OFF
:Loop
IF "%1" == "" GOTO Done
java YourClass %1
SHIFT
GOTO Loop
:Done
Сохраните указанный выше файл как пакетный файл (с расширением ".bat"), а затем вы можете перетащить его файлы на него, и он будет передан в качестве аргументов.
Кроме того, вы можете вызвать командный файл из командной строки и передать аргументы.
Редактировать: похоже, что командный файл не будет работать с аргументами в кавычках, которые содержат пробелы. Использование обходного пути, представленного на сайте, на который я указал, разделит пробелы, содержащиеся в цитируемом полном пути файла, на отдельные аргументы, так что это тоже не сработает. Если у кого-то есть хорошая идея, как это исправить, пожалуйста, либо отредактируйте эту запись, либо опубликуйте другой ответ. Я сделаю это вики-сообществом.
Вы уверены, что он не запустится? Я предполагаю, что это будет работать, но с некоторыми аргументами. Затем мы можем объединить / объединить все аргументы обратно в один в нашей программе Java. Что вы скажете?
Значит, нет возможности заставить окна сами передавать аргументы в main () с помощью перетаскивания?
Хорошо, я заставил это работать ... Базовые знания - использовать DropHandler UUID в реестре. Я сделал следующие базовые настройки:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.class]
@ = "JavaClass"
[HKEY_CLASSES_ROOT\JavaClass\DefaultIcon]
@ = "C:\\Java\\jdk1.6.0_05\\bin\\java.exe,1"
[HKEY_CLASSES_ROOT\JavaClass\shell\open]
@ = "Run Java class"
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@ = "\"C:\\Java\\jdk1.6.0_05\\bin\\java.exe\" \"%1\" %*"
[HKEY_CLASSES_ROOT\JavaClass\shellex\DropHandler]
@ = "{86C86720-42A0-1069-A2E8-08002B30309D}"
и ... не сработало!
Я просто забыл, что java.exe хочет имя класса, а не имя файла! Но я не вижу возможности сделать это в реестре.
К счастью, есть обходной путь, для которого все еще нужен файл сценария, если мы хотим быть универсальными, для работы с любыми / всеми файлами классов (конечно, со статической основной функцией!). Не партиями, я избегаю их, когда могу. Я решил использовать WSH, поскольку он должен быть доступен в любой современной системе Windows. Я также решил создать сценарий JS, это также мог быть сценарий VB.
Итак, я сделал следующий скрипт (LaunchJavaClass.js):
if (WScript.Arguments.count() == 0)
{
WScript.StdOut.Write("No parameters");
WScript.Quit(1);
}
var className = WScript.Arguments.Item(0);
//~ WScript.StdOut.Write(className + "\n");
var m = className.match(/^(.*)\\(.+?)\.class$/);
if (m == null)
{
WScript.StdOut.Write("Not a class file");
WScript.Quit(1);
}
var classPath = m[1];
className = m[2];
//~ WScript.StdOut.Write(classPath + " >>> " + className + "\n");
var params = new Array();
for (i = 1; i < WScript.Arguments.count(); i++)
{
params[params.length] = WScript.Arguments.Item(i);
}
var cmd = "cmd /c cd /D " + classPath +
" & C:/Java/jdk1.6.0_05/bin/java.exe " +
className + " " + params.join(" ");
//~ WScript.StdOut.Write(cmd + "\n");
var shell = WScript.CreateObject("WScript.Shell");
//~ var exec = shell.Exec(cmd); // Can be used to get stdout
shell.Run(cmd, 0);
Я оставил некоторые выходные данные, бесполезные в данном контексте, но пригодные для отладки (запускать с помощью cscript) .
Конечно, путь к JRE нужно скорректировать.
И я изменил command в реестре следующим образом:
[HKEY_CLASSES_ROOT\JavaClass\shell\open\command]
@ = "\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*"
Конечно, отрегулируйте путь и оставьте все вышеупомянутые линии.
Теперь, если я перетащу некоторые файлы в файл .class, он получит короткие пути к файлам в качестве аргументов функции main ().
import java.io.*;
class TestDnD
{
public static void main(String[] args)
{
Writer output = null;
try
{
output = new BufferedWriter(new FileWriter(new File("LogFile.txt")));
for (String arg : args)
{
output.write(arg + "\n");
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
return;
}
finally
{
try { output.close(); } catch (IOException e) {}
}
}
}
Я думаю, что первую версию файла .reg можно использовать для чего-то еще, например. перетаскивать .jar файлы (конечно, адаптируя).
Этот метод имеет ограниченное применение: мы редко создаем одноклассные программы на Java! Но это выглядело как хорошая и интересная задача, поэтому я не устоял перед ее решением. Примечание: вы можете добавить такие вещи, как -Djava.ext.dirs = "some path;another path", если вам когда-нибудь понадобится использовать внешние библиотеки (в файлах jar).
Ответ PhiLho отлично работает, если вы упаковываете классы в исполняемый файл JAR (в любом случае это то, как вы должны это делать) и создаете файл .reg, который выглядит так, как показано ниже. Затем просто дважды щелкните этот REG-файл, чтобы добавить его в реестр, и все готово. Это позволяет вам как дважды щелкнуть файл JAR, чтобы запустить его, так и запустить его путем перетаскивания.
Не забудьте изменить путь к месту установки исполняемого файла Java.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.jar]
@ = "jarfile"
[HKEY_CLASSES_ROOT\jarfile\DefaultIcon]
@ = "C:\\Java\\jdk1.7.0\\bin\\java.exe,1"
[HKEY_CLASSES_ROOT\jarfile\shell\open]
@ = "Run Java Program"
[HKEY_CLASSES_ROOT\jarfile\shell\open\command]
@ = "\"C:\\Java\\jdk1.7.0\\bin\\java.exe\" -jar \"%1\" %*"
[HKEY_CLASSES_ROOT\jarfile\shellex\DropHandler]
@ = "{86C86720-42A0-1069-A2E8-08002B30309D}"
Ключ drophandler - это все, что нужно было добавить, чтобы он работал идеально (остальные уже существовали). Однако меня смутило странное значение ключа: {86C867 ...} Итак, я немного покопался, и это ключ идентификатора Windows для обработчика целевого протокола .exe drop. По сути, это способ подключить стандартное поведение drag'n'drop для «передачи аргументов» в команду открытия jarfile. Чтобы убедиться, что номер для вас тот же, откройте regedit и выполните поиск значения «.exe drop target», он должен привести вас к ключу с этим идентификатором в HKEY_LOCAL_MACHINE / SOFTWARE / Classes / Fyi :)
Значение ключа "{60254CA5-953B-11CF-8C96-00AA00B8708C}" лучше для этого - это обработчик отбрасывания WSH, который лучше обрабатывает длинные имена файлов. (получено отсюда: stackoverflow.com/a/142854/638544)
Любой эквивалент для Mac OS X? У меня тоже есть файл, который я хотел бы перетащить в класс Java, чтобы предоставить перетаскиваемый файл в качестве аргумента.