2011-01-11 11 views
6

¿Cómo puedo hacer una ventana (tales como, javax.swing.JFrame, java.awt.Dialog, javax.swing.JDialog, etc. java.awt.Frame) reservar el borde de la pantalla, como un muelle, barra de tareas, Trillian, o OneNote Microsoft ¿poder? Mi objetivo es usar solo bibliotecas estándar JDK si es posible.Reservar el borde de la pantalla en Java

+0

¿Lo haría 'JSplitPane'? http://download.oracle.com/javase/tutorial/uiswing/components/splitpane.html – trashgod

+0

¿Quiere decir que desea crear ventanas que comporten la barra de herramientas en el escritorio de Windows? – AlexR

+0

@trashgod: 'javax.swing.JSplitPane' no funcionará; es un componente que solo funciona dentro de una ventana – Supuhstar

Respuesta

2

Este comportamiento es muy específico para el sistema operativo Windows, y como tal, no hay manera de hacer esto en la norma JDK o AWT/Swing, ya que estos deben funcionar de manera consistente en varios sistemas operativos diferentes.

El equivalente más cercano a lo que desea es obtener los límites de la pantalla actual y mover/cambiar el tamaño de la ventana para que coincida con un lado, aunque ahora tendrá algún efecto en el escritorio u otras ventanas.

Lo más parecido que probablemente obtendrá a lo que quiere es usar JNIWrapper and WinPack para alterar el comportamiento de la ventana nativa. Sin embargo, su documentación no muestra nada sobre las barras de herramientas de escritorio. Probablemente tendrá que usar su JNI para acceder directamente a las funciones COM específicas y luego descubrir cómo hacerlo en C++, pero si no conoce C++, probablemente esté fuera del alcance de su proyecto.

Adición:

Si desea hacer uso de las características nativas para los sistemas operativos y entornos de escritorio específico, tendrá que conectar con una biblioteca nativa C++ para enganchar en Gnome, KDE, Mac OS, etc. Busque "Java JNI" y el sistema de ventanas con el que desea integrar para encontrar paquetes que pueda usar. Por ejemplo, para Gnome, vea here.

Si desea admitir múltiples sistemas operativos, asegúrese de crear una interfaz común para que pueda realizar implementaciones que se conecten con los JNI respectivos según cuál esté disponible en tiempo de ejecución, y permitir la recuperación si ninguno de ellos está disponible.

PS. Si desea notificaciones emergentes en su aplicación, Mac OS y varias compilaciones de Linux admiten Growl para que pueda ahorrar algo de tiempo.

+0

Tenía miedo de eso u.u ¿Por qué otros SO no pueden tener todas las capacidades de Windows? : c – Supuhstar

+0

Bueno, para empezar, si todos los SO tuvieran todas las mismas características, no habría elección para los consumidores.Además, debemos recordar que Java no está diseñado solo para PC, sino que también se ejecuta en teléfonos móviles, sistemas de seguridad y otros dispositivos integrados que pueden tener capacidades de visualización muy limitadas, o ninguna en absoluto. Sun/Oracle no puede escribir código nativo para admitir todas las configuraciones posibles de hardware y software. Ahí es donde tienes que encontrar un JNI que haga lo que quieras, o escribir uno tú mismo. Supongo que tendrás que buscar la solución simple: mover y cambiar el tamaño de la ventana de tu aplicación. – BoffinbraiN

+0

Espera ... Pero OS X puede reservar la parte superior para la barra de menú y otros lados para el dock, Gnome y Unity pueden hacer lo mismo ... ¿por qué es este SO específico? – Supuhstar

2

Puede utilizar Toolkit.getDefaultToolkit(). GetScreenInsets() De fuentes JMenu

Toolkit toolkit = Toolkit.getDefaultToolkit(); 
    GraphicsConfiguration gc = getGraphicsConfiguration(); 
    Rectangle screenBounds = new Rectangle(toolkit.getScreenSize()); 
    GraphicsEnvironment ge = 
     GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 
    for(int i = 0; i < gd.length; i++) { 
     if(gd[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) { 
      GraphicsConfiguration dgc = 
       gd[i].getDefaultConfiguration(); 
      if(dgc.getBounds().contains(position)) { 
       gc = dgc; 
       break; 
      } 
     } 
    } 


    if (gc != null) { 
     screenBounds = gc.getBounds(); 
     // take screen insets (e.g. taskbar) into account 
     Insets screenInsets = toolkit.getScreenInsets(gc); 

     screenBounds.width -= 
        Math.abs(screenInsets.left + screenInsets.right); 
     screenBounds.height -= 
        Math.abs(screenInsets.top + screenInsets.bottom); 
     position.x -= Math.abs(screenInsets.left); 
     position.y -= Math.abs(screenInsets.top); 
    } 
+0

¿cuál es la posición? – Supuhstar

+0

también, ejecutar este método no parece hacer nada – Supuhstar

+0

Responda. – Supuhstar

Cuestiones relacionadas