2008-12-20 3 views
5

메인 메소드가있는 자바 클래스 파일이 있습니다. Windows에서 바탕 화면 아이콘/짧게/etc로 파일을 드래그하여 내 기본 메서드에 파일 이름을 제공 할 수 있기를 바랍니다. 기본적으로 사용자가 명령 줄에 파일을 입력하는 대신 프로그램 실행시 파일을 끌어다 놓을 수있게하려고합니다.Windows에서 드래그 앤 드롭으로 자바 클래스 실행

의견이 있으십니까?

+0

Mac OS X의 모든 기능은 무엇입니까? 드래그 된 파일을 인수로 제공하기 위해 Java 클래스로 드래그하려는 파일도 있습니다. – Eptin

답변

0

Adiel A.에 추가 Swing을 사용하여 Java 창을 시작하는 배치 파일을 만드는 경우. 사용자가 파일을 해당 창에 놓게하십시오. 그런 다음 삭제 된 파일을 통해 루트를 지정할 수 있습니다.

+0

정리를 위해 내 게시물을 삭제했습니다. 그 질문을 잘 읽지 않았기 때문에 그것은 오해였습니다. 바보 야. –

4

daub815의 대답을 기반으로 Windows에서 배치 파일을 사용하여 다른 명령에 인수를 전달할 수 있습니다. 이 경우 main 메소드를 사용하여 클래스를 실행하려면 java 실행 프로그램을 사용합니다.

다른 명령에 및 found a page with a batch file to pass arguments 여러 개의 인수를 사용하기 위해 배치 파일을 작성하는 방법에 대한 빠른 Google 검색을 수행했습니다.

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

저장 (는 "박쥐"확장자) 배치 파일로 위의 파일, 그리고 당신은 드래그 앤 드롭 할 수 파일에 : 예는 에서 적응, 여기 당신이 할 수있는 것입니다 그것을 인수로 전달할 것입니다.

또한 명령 줄에서 배치 파일을 호출하고 인수도 전달할 수 있습니다.

편집 : 배치 파일은 공백이 포함 된 인용 인수와 함께 작동하지 않는 것으로 보입니다. 링크 된 사이트에있는 해결 방법을 사용하면 따옴표 붙은 파일의 전체 경로에 포함 된 공백이 별도의 인수로 분리되어 작동하지 않습니다. 누구든지이 문제를 해결하는 방법을 알고 있다면이 항목을 편집하거나 다른 답변을 게시하십시오. 나는 이것을 커뮤니티 위키로 만들 것이다.

+0

나는 이것을 시험해 볼 것이다, 고마워! –

+0

실행되지 않을까요? 나는 그것이 실행될 것이라고 생각하지만, 몇 가지 주장을한다. 그런 다음 Java 프로그램에서 모든 인수를 다시 병합/병합 할 수 있습니다. 너 뭐라구? –

0

Windows 자체가 끌어다 놓기를 통해 main()에 args를 전달할 수있는 방법이 없습니다.

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를 사용하기로했다. 나는 또한 JS 스크립트를 만들기로 결심했다. VB 스크립트 일 수도있다.

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를 사용하여 실행) 디버깅을 위해 일부 출력이 맥락에서 유용하지만 사용할 수 없습니다 왼쪽 :

그래서 나는 다음과 같은 스크립트 (LaunchJavaClass.js)을했다.
물론 JRE 경로를 조정해야합니다.물론

[HKEY_CLASSES_ROOT\JavaClass\shell\open\command] 
@="\wscript -b "D:\\_PhiLhoSoft\\WSH\\LaunchJavaClass.js\" %1 %*" 

, 경로를 조정하고, 위의 다른 라인을 유지 :

그리고

나는 다음과 같이 레지스트리에 command을 변경했습니다.

이제 일부 파일을 .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 파일에 drag'n'drop (물론 적용).

이 기술은 제한적으로 사용됩니다. 우리는 거의 자바로 하나의 클래스 프로그램을 만듭니다! 그러나 그것은 좋고 흥미로운 도전처럼 보였습니다. 그래서 그것을 해결하는 것에 저항하지 않았습니다. 참고 : 외부 라이브러리 (jar 파일)를 사용해야하는 경우 -Djava.ext.dirs="some path;another path"과 같은 항목을 추가 할 수 있습니다.

2

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}" 
+0

drophandler 키는 완벽하게 작동하기 위해 추가되어야하는 모든 것이 었습니다 (다른 것들은 이미 존재했습니다). 그러나 이상한 키 값에 대해 혼란 스러웠습니다. {86C867 ...} 그래서 파기를했는데 이것은 .exe 드롭 대상 프로토콜 처리기의 Windows ID 키입니다. 이것은 본질적으로 '인수 전달'의 기본 drag'n'drop 동작을 jarfile 열기 명령에 연결하는 방법입니다. 숫자가 같은지 확인하려면 regedit을 열고 ".exe drop target"값을 검색하면 HKEY_LOCAL_MACHINE/SOFTWARE/Classes/ Fyi :) 아래에이 ID가있는 키가 나타납니다. – Andrew

관련 문제