2008-10-29 72 views
5

Câu hỏiMở cửa sổ Trình duyệt từ chương trình Java

Tôi có một ứng dụng được viết bằng Java. Nó được thiết kế để chạy trên một hộp Linux độc lập. Tôi đang cố gắng tạo ra một cửa sổ mới firefox. Tuy nhiên, firefox không bao giờ mở. Nó luôn có mã thoát shell 1. Tôi có thể chạy cùng mã này với gnome-terminal và nó mở ra tốt.

nền

Vì vậy, đây là quá trình của nó khởi tạo:

  1. Bắt đầu X "Xorg: 1 -br -terminate -dpms -quiet VT7"
  2. Bắt đầu Window Manager "metacity - -display =: 1 --replace "
  3. Định cấu hình tài nguyên" xrdb -merge/etc/X11/Xresources "
  4. Trở thành một daemon và ngắt kết nối khỏi kiểm soát t erminal

Khi chương trình đang hoạt động, có một nút mà người dùng có thể nhấp vào đó sẽ sinh ra một cửa sổ firefox. Đây là mã của tôi để làm điều đó. Hãy nhớ rằng X đang chạy trên màn hình: 1.


public boolean openBrowser() 
{ 
    try { 
    Process oProc = Runtime.getRuntime().exec("/usr/bin/firefox --display=:1"); 
    int bExit = oProc.waitFor(); // This is always 1 for some reason 

    return true; 

    } catch (Exception e) { 
    oLogger.log(Level.WARNING, "Open Browser", e); 
    return false; 
    } 
} 
+0

Tôi nghĩ có điều gì đó bị thiếu. – Patrick

+0

Bạn nói đúng. Bằng cách nào đó tôi đã đăng nó trước khi tôi gõ xong. Nó nên ở đó đầy đủ. –

Trả lời

2

sau khi đọc câu trả lời khác nhau và ý kiến ​​khác nhau (từ người hỏi), đây là những gì tôi sẽ làm

1) cố gắng tiếp cận java này http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ProcessBuilder.html

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory("myDir"); 
Process p = pb.start(); 

xem thêm về lớp này:

http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#2
http://www.javabeat.net/tips/8-using-the-new-process-builder-class.html

2) cố gắng làm điều này (việc chạy firefox) từ C/C++/ruby ​​/ python và xem đó là thành công.

3) nếu mọi thứ khác không thành công, tôi sẽ khởi chạy chương trình shell và chương trình shell đó sẽ khởi chạy firefox !!

+0

Điều này đã hiệu quả. Khi nó quay ra, vì tôi không chạy một môi trường Desktop, tôi phải thiết lập biến môi trường HOME cho firefox để chạy đúng cách. –

9

Nếu bạn có thể thu hẹp nó xuống để Java 6, bạn có thể sử dụng API để bàn:

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/

nên giống như thế:

if (Desktop.isDesktopSupported()) { 
     Desktop desktop = Desktop.getDesktop(); 
     if (desktop.isSupported(Desktop.Action.BROWSE)) { 
      try { 
       desktop.browse(new URI("http://localhost")); 
      } 
      catch(IOException ioe) { 
       ioe.printStackTrace(); 
      } 
      catch(URISyntaxException use) { 
       use.printStackTrace(); 
      } 
     } 
    } 
+2

Tôi đã cố gắng sử dụng điều này, nhưng tôi nhận được một traceback.

 java.io.IOException: Failed to show URI: at sun.awt.X11.XDesktopPeer.launch(XDesktopPeer.java:75) at sun.awt.X11.XDesktopPeer.browse(XDesktopPeer.java:64) at java.awt.Desktop.browse(Desktop.java:368) 

0

Bạn có thể có kết quả tốt hơn may mắn nếu bạn đọc và hiển thị đầu ra tiêu chuẩn/luồng lỗi, vì vậy bạn có thể bắt bất kỳ thông báo lỗi nào mà firefox có thể in.

+0

Tôi dường như không nhận được bất kỳ đầu ra nào từ firefox. –

4

Sử dụng BrowserLauncher.

Gọi nó là rất dễ dàng, chỉ cần đi

new BrowserLauncher().openURLinBrowser("http://www.google.com"); 
0
try { 
    String url = "http://www.google.com"; 
    java.awt.Desktop.getDesktop().browse(java.net.URI.create(url)); 
} catch (java.io.IOException e) { 
    System.out.println(e.getMessage()); 
} 
Các vấn đề liên quan