SWT로 화면을 만들다가 이미지 라벨을 클릭하면 웹브라우저를 띄워야 할 일이 생겼습니다.

어떻게 띄워야지.. 하며 고민하다가 어짜피 외부프로그램 실행 하는 방법으로 하면 되지 않을까?

구글에게 물어봤습니다.

답이 나오 더군요...^^;

그래서 저번시간에 했던 내용과 연계해서 샘플을 만들어 봤습니다.

소스 내용은 저번과 비슷한데 좀 정리를 해봤습니다.

 

소스는 아래와 같습니다.

ProcessBuilderExample .java

import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.Scanner;
 
/**
 * @author falbb
 *
 */
public class ProcessBuilderExample {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 띄울 URL
		String url = "http://www.google.com";
 
		String[] cmd = null;
		try {
			// 실행 커맨드 명령어 취득
			cmd = getUrlCmd(url);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			return;
		}
 
		if (cmd == null) {
			System.out.println("실행할 커맨드가 없습니다.");
		} else {
			// 커맨드 실행
			executeCmd(cmd);
		}
 
	}
 
	/**
	 * OS를 확인하여 그에 해당하는 커맨드를 설정하여 반환한다.
	 * @param url
	 * @return
	 * @throws Exception
	 */
	private static String[] getUrlCmd(String url) throws Exception {
 
		String[] cmd = null; 
 
		// os확인
		if (System.getProperty("os.name").indexOf("Windows") > -1) {
			// windows일 경우
			cmd = new String[] {"rundll32", "url.dll", "FileProtocolHandler",  url};
		} else {
			// windows이외인 경우
			String[] browsers = {"firefox", "mozilla", "konqueror", "eqiphany", "netscape"};
			String browser = "";
 
			try {
				for (int i = 0; i < browsers.length && "".equals(browser); i ++) {
 
					// which로 깔려있는 인터넷 브라우저를 탐색
					if (new ProcessBuilder(new String[] { "which", browsers[i] }).start().waitFor() == 0) {
						browser = browsers[i];
					}
				}
 
				// 브라우저가 아무것도 없을면
				if ("".equals(browser)) {
					// 브라우저가 없을 경우 Exception발생 시킴
					throw new Exception("Could not find web browser");
				} else {
					cmd = new String[]{browser, url};
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
 
		return cmd;
	}
 
	/**
	 * 커맨드 실행
	 * @param cmd
	 */
	private static void executeCmd(String[] cmd) {
 
		Process process = null;
		try {
 
			// 프로세스빌더 실행
			process = new ProcessBuilder(cmd).start();
 
			// SequenceInputStream은 여러개의 스트림을 하나의 스트림으로 연결해줌.
			SequenceInputStream seqIn = new SequenceInputStream(
					process.getInputStream(), process.getErrorStream());
 
			// 스캐너클래스를 사용해 InputStream을 스캔함
			Scanner s = new Scanner(seqIn);
 
			while (s.hasNextLine() == true) {
				// 표준출력으로 출력
				System.out.println(s.nextLine());
			}
 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

메인이 되는 부분만 화면 캡처해서 설명 하겠습니다.

 

img1.png

 

커맨트가 달려 있어서 그리 설명할 필요는 없지만...

굳이 설명 하자면...

먼저 OS를 확인합니다.

① 윈도우일 경우는 커맨드를 아래와 같이 설정 했습니다.

추즉한건데 아마도 윈도우 탐색기 쪽에 url을 넣으면 브라우저가 실행되는 그런 형태 같습니다.

cmd = new String[] {"rundll32", "url.dll", "FileProtocolHandler",  url};

 

②윈도우가 아닐경우, 리눅스인 경우가 대부분 이겠죠!

    리눅스같은 경우는 which로 설치되어 있는 브라우저를 찾습니다.

    찾을때 ProcessBuilder을 사용해서 찾는데 executeCmd를 사용해서 찾게 해도 되지만...

    저의 귀찮니즘으로 인해...  그냥 new ProcessBuilder()로 which실행을 하고 있습니다.

    이점 양해 바랍니다. ^^;

 

강좌 내용은 별거 아니지만, 없으면 아쉬울 것 같아 올려봅니다.

감사합니다.