Запуск классов Java с помощью перетаскивания окон

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

Есть предположения?

Любой эквивалент для Mac OS X? У меня тоже есть файл, который я хотел бы перетащить в класс Java, чтобы предоставить перетаскиваемый файл в качестве аргумента.

Eptin 17.09.2016 02:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
4 328
5

Ответы 5

Добавление в Adiel A. Если вы создаете командный файл, который запускает ваше окно Java с помощью Swing. Вы бы попросили пользователя перетащить файлы в это окно. После этого вы сможете получить root-доступ через эти сброшенные файлы.

Я удалил свой пост, чтобы навести порядок. Это было недоразумением, потому что я плохо прочитал вопрос. Глупый я.

Adeel Ansari 20.12.2008 17:29

Чтобы использовать ответ daub815, в Windows вы можете использовать командный файл для передачи аргументы другой команды. В этом случае мы будем использовать программу запуска java, чтобы запустите свой класс методом main.

Я быстро поискал в Google, как написать командный файл, чтобы принимать несколько аргументов, и нашел страницу с командным файлом для передачи аргументов другой команде. Адаптация от пример, вот что вы можете сделать:

@ECHO OFF
:Loop
IF "%1" == "" GOTO Done
java YourClass %1
SHIFT
GOTO Loop
:Done

Сохраните указанный выше файл как пакетный файл (с расширением ".bat"), а затем вы можете перетащить его файлы на него, и он будет передан в качестве аргументов.

Кроме того, вы можете вызвать командный файл из командной строки и передать аргументы.

Редактировать: похоже, что командный файл не будет работать с аргументами в кавычках, которые содержат пробелы. Использование обходного пути, представленного на сайте, на который я указал, разделит пробелы, содержащиеся в цитируемом полном пути файла, на отдельные аргументы, так что это тоже не сработает. Если у кого-то есть хорошая идея, как это исправить, пожалуйста, либо отредактируйте эту запись, либо опубликуйте другой ответ. Я сделаю это вики-сообществом.

Вы уверены, что он не запустится? Я предполагаю, что это будет работать, но с некоторыми аргументами. Затем мы можем объединить / объединить все аргументы обратно в один в нашей программе Java. Что вы скажете?

Adeel Ansari 20.12.2008 17:28

Значит, нет возможности заставить окна сами передавать аргументы в 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 :)

Andrew 03.11.2014 10:27

Значение ключа "{60254CA5-953B-11CF-8C96-00AA00B8708C}" лучше для этого - это обработчик отбрасывания WSH, который лучше обрабатывает длинные имена файлов. (получено отсюда: stackoverflow.com/a/142854/638544)

Brilliand 14.09.2018 08:45

Другие вопросы по теме