Modificar la ubicación y posición de una ventana abierta desde Desktop.Browser

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

¿Cómo haría para editar la ubicación y el tamaño de la ventana abierta aquí? Tendrá que ser posible hacer multiplataforma. Si no hay una solución para multiplataforma, ¿cuáles son las soluciones para cualquier cosa con la que funcione Desktop?

(Esta es una pregunta que se desvía, pero ¿podría también hacer zoom en parte de la página web?)

(También fuera de duda, pero si hay otra forma de abrir la ventana, con la manija incluida, ¿cómo se podría hacer?)

preguntado el 02 de julio de 12 a las 01:07

Conozco una solución dependiente de la plataforma, pero solo para Windows, y requeriría JNA o JNI. -

Necesitaría que fuera multiplataforma, pero estoy interesado en su método. -

2 Respuestas

Desde mi experiencia, el getDesktop().browse(URI.create(URL)); no funciona en Mac, por lo que incluso si puede encontrar el equivalente de la solución @Hovercraft Full of Eels para Mac, no importaría.

Todavía no probé Desktop con Java 7.1 en Mac, pero no funcionó con la versión anterior de Java.

Si realmente desea una plataforma cruzada, creo que necesita usar WebView en JavaFX: JavaFX ahora está disponible en Mac y es un navegador completamente funcional. Hay muchos tutoriales sobre cómo mezclar JavaFX con Swing y creo que las [muestras de JavaFX] incluyen webView.1

Respondido 02 Jul 12, 05:07

¿Esto también funciona en LWJGL (Parece que no puedo encontrar la respuesta a través de Google)? Gavin Gasmann

LWJGL es Java puro, ¿verdad? Desde una aplicación Java, puede iniciar una escena JavaFX con una vista web y señalarla a una página web de su elección, siempre que el escritorio del cliente tenga instalado el tiempo de ejecución JavaFX (que ahora se descarga automáticamente con la última versión de Java 7). espina

No estoy seguro, vengo de un fondo de C # al modding del juego "Minecraft". No sé toda la información que debería al respecto, pero lo intentaré. gracias por la ayuda. - Gavin Gasmann

Así es como moví y redimensioné Windows en una configuración de plataforma Windows. Es una pequeña fracción de parte de mi código de biblioteca de 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);

}

Esto requeriría que tenga jna.jar y platform.jar de la biblioteca JNA en su classpath. Y nuevamente, esto es solo para la plataforma Windows. La primera parte del código, TestMoveWindow, es simplemente una GUI de prueba para demostrar cómo funciona el programa, y ​​en realidad es poco más que una llamada a JnaUtil.moveWindow(hWnd, x, y, w, h);, pero la "carne" del código es mi clase JnaUtil y la interfaz User32. La biblioteca JNA hace que hacer esto so fácil, es ridículo. Para que mi código funcione, también necesita saber el inicio del texto de la ventana, que a menudo es el título de la página web, para que pueda obtener un puntero a la ventana.

Sinceramente, no sé si existe alguna solución multiplataforma. Me gustaría pensar que existe, pero lo dudo un poco, ya que creo que esto siempre requeriría llamadas al sistema, ¡pero me encantaría que me demuestren que estoy equivocado!

Respondido 02 Jul 12, 02:07

Incluso si no existe una solución multiplataforma simple, debería existir una solución para cada sistema operativo principal (Linux, Mac, Windows), ¿correcto? - Gavin Gasmann

@Gavin: ¡Absolutamente! Pero no intentes preguntar me cualquier cosa sobre Unix, Mac o cualquier otra cosa que no sea Windows. :) - Aerodeslizador lleno de anguilas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.