2008-12-20 3 views
5

У меня есть файл класса java с основным методом. В Windows я хотел бы иметь возможность перетаскивать файлы на значок рабочего стола/короткий/и т. Д., Который вызывал бы поставку имен файлов в мой основной метод. В принципе, я хочу разрешить пользователям перетаскивать файлы при выполнении программы, а не вводить их в командной строке.Запуск классов Java через окна drag-and-drop

Любые мысли?

+0

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

ответ

0

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

+0

Я удалил свой пост, чтобы очистить вещи. Это было непонимание, потому что я не хорошо прочитал этот вопрос. Глупый я. –

4

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

Я сделал быстрый поиск в Google о том, как писать командный файл, чтобы принимать несколько аргументов, и found a page with a batch file to pass arguments другой команде. Адаптация из пример, вот что вы можете сделать:

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

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

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

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

+0

Я попробую это, спасибо! –

+0

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

0

Итак, нет способа, чтобы окна сами передавали args в main() посредством перетаскивания?

2

ОК, я заработал ... Основополагающее знание - использовать 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 может быть использована для чего-то еще, например. для drag'n'drop на .jar-файлах (приспосабливая его, конечно).

Этот метод имеет ограниченное применение: мы редко делаем одноклассные программы на Java! Но это выглядело как хорошая и интересная задача, поэтому я не сопротивлялся ее разрешению. Примечание: вы можете добавить такие вещи, как -Djava.ext.dirs="some path;another path", если вам когда-либо понадобится использовать внешние библиотеки (в файлах jar).

2

Ответ PhiLho отлично работает, если вы упаковываете классы в исполняемый JAR-файл (так оно и должно быть сделано), и создайте REG-файл, который выглядит так, как показано ниже. Затем просто дважды щелкните этот файл .reg, чтобы объединить его в реестр, и вам хорошо идти. Это позволяет вам дважды щелкнуть JAR-файл, чтобы запустить его, и запустить его с помощью Drag & Drop.

Не забудьте изменить путь к месту установки исполняемого файла 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}" 
+0

Ключ дрофандлера был всем, что нужно было добавить, чтобы он работал отлично (другие уже существовали). Я, однако, путался о странном ключевом значении: {86C867 ...} Итак, я сделал некоторое копание, и это ключ окна id для обработчика протокола целевой задачи .exe. Это, по сути, способ подключения по умолчанию drag'n'drop поведения «передачи аргументов» в команду открытия jarfile. Чтобы убедиться, что номер для вас одинаковый, откройте regedit и выполните поиск значения «.exe drop target», он должен привести вас к ключу с этим идентификатором в HKEY_LOCAL_MACHINE/SOFTWARE/Классы/ Fyi :) – Andrew

 Смежные вопросы

  • Нет связанных вопросов^_^