Запуск Java-классов с помощью перетаскивания окон - PullRequest
5 голосов
/ 20 декабря 2008

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

Есть мысли?

Ответы [ 5 ]

4 голосов
/ 20 декабря 2008

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

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

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

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

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

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

3 голосов
/ 02 июля 2012

Ответ 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}" 
2 голосов
/ 20 декабря 2008

ОК, я заставил это работать ... Базовые знания - использовать UHID DropHandler в реестре. Я сделал базовую настройку следующим образом:

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-файлах).

0 голосов
/ 20 декабря 2008

То есть нет способа, чтобы Windows сама передавала аргументы в main () с помощью перетаскивания?

0 голосов
/ 20 декабря 2008

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

...