0
    if (Desktop.isDesktopSupported()) 
    {
        Desktop.getDesktop().browse(URI.create(URL));
    }

ここで開いたウィンドウの位置とサイズを編集するにはどうすればよいですか? クロスプラットフォームを実行できる必要があります。クロスプラットフォームのソリューションがない場合、デスクトップで動作するソリューションは何ですか?

(質問から逸れましたが、ウェブページの一部を拡大してもよろしいですか?)

(また、質問外ですが、ハンドルを含めてウィンドウを開く別の方法がある場合、どうすればこれを行うことができますか?)

4

2 に答える 2

2

私の経験では、getDesktop().browse(URI.create(URL));Mac では動作しないため、Mac 用の @Hovercraft Full of Eels ソリューションに相当するものが見つかったとしても、問題にはなりません。

Mac で Java 7.1 を使用した Desktop をまだテストしていませんが、以前のバージョンの Java では動作しませんでした。

本当にクロス プラットフォームが必要な場合は、JavaFX で WebView を使用する必要があると思います。JavaFX は Mac で利用できるようになり、完全に機能するブラウザーです。JavaFX と Swing の混合に関するチュートリアルはたくさんありますが、[JavaFX サンプル] には webView が含まれていると思います。1

于 2012-07-02T04:24:39.920 に答える
2

これは、Windows プラットフォーム設定で Windows を移動およびサイズ変更した方法です。これは、私の User32 JNA Windows ライブラリ コードのごく一部です。

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 ライブラリーを使用すると、これを非常に簡単に行うことができます。私のコードが機能するためには、ウィンドウへのポインターを取得できるように、ウィンドウ テキスト (多くの場合、Web ページのタイトル) の開始も知る必要があります。

正直なところ、クロスプラットフォーム ソリューションが存在するかどうかはわかりません。あると思いたいのですが、これには常にシステムコールが必要になると信じているので、ちょっと疑わしいですが、間違っていることが証明されたいです!

于 2012-07-02T01:05:54.693 に答える