2012-07-02 3 views
0
if (Desktop.isDesktopSupported()) 
    { 
     Desktop.getDesktop().browse(URI.create(URL)); 
    } 

여기에서 열린 창의 위치와 크기를 편집하는 방법은 무엇입니까? 교차 플랫폼을 수행 할 수 있어야합니다. 크로스 플랫폼에 대한 해결책이 없다면 데스크톱과 함께 작동하는 솔루션은 무엇입니까? Desktop.Browser에서 열린 창의 위치와 위치 수정

가 (이 질문을 벗어나고 있지만, 나는 또한 웹 페이지의 일부분을 확대 할 수 있을까?)

(또한 오프 질문,하지만 핸들을 포함하여 창을 열 수있는 또 다른 방법이 존재하는 경우, 어떻게 이 작업을 수행 할 수 있습니까?)

+1

플랫폼 의존적 인 솔루션을 알고 있지만 Windows에만 해당되며 JNA 또는 JNI가 필요합니다. –

+0

크로스 플랫폼이 필요 하겠지만 당신의 방법에 관심이 있습니다. –

+0

편집 해 주셔서 감사합니다. Dimo. –

답변

2

내 경험에 의하면 getDesktop().browse(URI.create(URL));은 Mac에서 작동하지 않으므로 Mac에서 @Hovercraft Full Eels 솔루션을 사용할 수 있다고해도 문제가되지 않습니다.

아직 Mac에서 Java 7.1로 데스크톱을 테스트하지는 않았지만 이전 버전의 Java에서는 작동하지 않았습니다.

크로스 플랫폼을 원할 경우 JavaFX에서 WebView를 사용해야한다고 생각합니다. 이제 JavaFX를 Mac에서 사용할 수 있으며 모든 기능을 갖춘 브라우저입니다. JavaFX와 Swing을 섞은 튜토리얼이 많이 있습니다. [JavaFX 샘플]에는 WebView가 포함되어 있다고 생각합니다. 1

+0

LWJGL에서도 작동합니까? (검색을 통해 대답을 찾을 수 없음) –

+1

LWJGL은 순수한 Java입니다. Java App에서 JavaFX 장면을 웹보기로 실행하고 클라이언트 데스크탑에 JavaFX 런타임이 설치된 경우 (현재 최신 Java 7 다운로드와 자동으로 연결됨) – Thorn

+0

나는 확실하지, 나는 C# 배경에서 게임 "Minecraft"modding으로 갈거야. 나는 그것에 관한 모든 정보를 모른다. 그러나 나는 이것을 시도 할 것이다. 도와 주셔서 감사합니다. –

2

Windows 플랫폼 설정에서 Windows를 이동하고 크기를 조정 한 방법입니다. 그것은 내가 User32 JNA 윈도우 라이브러리 코드의 일부 작은 부분이다 :

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 

import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.win32.StdCallLibrary; 

@SuppressWarnings("serial") 
public class TestMoveWindow extends JPanel { 
    public static final String[] BOUNDS_NAMES = { "x", "y", "w", "h" }; 
    private JTextField windowNameField = new JTextField(15); 
    private JTextField[] boundsFields = new JTextField[BOUNDS_NAMES.length]; 

    public TestMoveWindow() { 
     JPanel winNamePanel = new JPanel(); 
     winNamePanel.add(new JLabel("Window Name:")); 
     winNamePanel.add(windowNameField); 

     JPanel boundsPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     for (int i = 0; i < BOUNDS_NAMES.length; i++) { 
     JPanel fieldPanel = new JPanel(); 
     fieldPanel.add(new JLabel(BOUNDS_NAMES[i] + ":")); 
     boundsFields[i] = new JTextField(3); 
     fieldPanel.add(boundsFields[i]); 
     boundsPanel.add(fieldPanel); 
     } 

     JPanel btnPanel = new JPanel(); 

     Action doItAction = new AbstractAction("Do it!") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String startOfWindowName = windowNameField.getText().trim(); 
      Pointer hWnd = JnaUtil.getWinHwnd(startOfWindowName); 
      if (hWnd == null || startOfWindowName.isEmpty()) { 
       String message = String.format(
        "Window named \"%s\" was not found", startOfWindowName); 
       JOptionPane.showMessageDialog(TestMoveWindow.this, message, 
        "Window Not Found", JOptionPane.ERROR_MESSAGE); 
       return; 
      } 
      int x = 0; 
      int y = 0; 
      int w = 0; 
      int h = 0; 

      String xStr = boundsFields[0].getText(); 
      String yStr = boundsFields[1].getText(); 
      String wStr = boundsFields[2].getText(); 
      String hStr = boundsFields[3].getText(); 
      try { 
       x = Integer.parseInt(xStr); 
       y = Integer.parseInt(yStr); 
       w = Integer.parseInt(wStr); 
       h = Integer.parseInt(hStr); 
      } catch (NumberFormatException e1) { 
       String message = String 
        .format(
          "Numbers cannot be parsed: \"%s\", \"%s\", \"%s\", \"%s\"", 
          xStr, yStr, wStr, hStr); 
       JOptionPane.showMessageDialog(TestMoveWindow.this, message, 
        "Numbers Not Parseable", JOptionPane.ERROR_MESSAGE); 
       return; 
      } 

      JnaUtil.moveWindow(hWnd, x, y, w, h); 

     } 
     }; 
     btnPanel.add(new JButton(doItAction)); 

     windowNameField.addActionListener(doItAction); 
     for (JTextField boundField : boundsFields) { 
     boundField.addActionListener(doItAction); 
     } 

     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(winNamePanel); 
     add(boundsPanel); 
     add(btnPanel); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Test Move Window"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TestMoveWindow()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 

} 

class JnaUtil { 
    private static final User32 user32 = User32.INSTANCE; 
    private static Pointer callBackHwnd; 

    public static Pointer getWinHwnd(final String startOfWindowName) { 
     callBackHwnd = null; 

     user32.EnumWindows(new User32.WNDENUMPROC() { 
     @Override 
     public boolean callback(Pointer hWnd, Pointer userData) { 
      byte[] windowText = new byte[512]; 
      user32.GetWindowTextA(hWnd, windowText, 512); 
      String wText = Native.toString(windowText).trim(); 

      if (!wText.isEmpty() && wText.startsWith(startOfWindowName)) { 
       callBackHwnd = hWnd; 
       return false; 
      } 
      return true; 
     } 
     }, null); 
     return callBackHwnd; 
    } 

    public static boolean moveWindow(Pointer hWnd, int x, int y, int nWidth, 
     int nHeight) { 
     boolean bRepaint = true; 
     return user32.MoveWindow(hWnd, x, y, nWidth, nHeight, bRepaint); 
    } 

} 

interface User32 extends StdCallLibrary { 
    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 

    interface WNDENUMPROC extends StdCallCallback { 
     boolean callback(Pointer hWnd, Pointer arg); 
    } 

    boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer userData); 

    boolean MoveWindow(Pointer hWnd, int x, int y, int nWidth, int nHeight, 
     boolean bRepaint); 

    int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount); 

} 

이것은 당신이 당신의 클래스 패스에 JNA 라이브러리에서 jna.jar 및 platform.jar을 가지고 필요합니다. 그리고 이것은 Windows 플랫폼 전용입니다. 코드의 첫 번째 부분 인 TestMoveWindow는 프로그램이 작동하는 방식을 보여주는 테스트 GUI 일 뿐이며 실제로는 JnaUtil.moveWindow(hWnd, x, y, w, h);을 호출하는 것 이상이지만 코드의 "고기"는 JnaUtil 클래스 및 User32 인터페이스입니다. JNA 라이브러리는이 일을 이므로 쉽습니다. 우스꽝 스럽습니다. 내 코드가 작동하려면 창 텍스트 (종종 웹 페이지의 제목)의 시작을 알아야합니다. 그러면 창에 대한 포인터를 얻을 수 있습니다.

크로스 플랫폼 솔루션이 있는지 솔직히 알 수 없습니다. 나는 그것이 있다고 생각하고 싶습니다.하지만 이것은 항상 시스템 호출을 요구할 것이라고 생각하기 때문에 의심 스럽습니다. 그러나 틀린 것으로 입증되기를 바랍니다!

+0

간단한 크로스 플랫폼 솔루션이없는 경우에도 각 주요 OS (Linux, Mac, Windows)에 대한 솔루션이 존재해야합니까? –

+1

@ 개 빈 : 오, 절대적으로! 그러나 유닉스, 맥, 또는 윈도우 이외의 것에 대해서는 전혀 묻지 말아라. :) –

관련 문제