2009-10-27 11 views
8

alt textCómo implementar una barra de título Google-cromo-como por aplicación Java SWT

He heredado el desarrollo de una aplicación Java/SWT se ejecuta en Windows solamente. Una de las solicitudes de funciones que necesito para el alcance es una barra de título de tipo Google Chrome en lugar de la barra de título de ventanas de SWT. Las pestañas de la aplicación aparecen en el mismo nivel que los botones de control de la ventana.

Mi entendimiento es que necesitaré:

  • escribir Reproductor de Windows capaz de hacer que el diseño personalizado y la gestión de pestañas en lugar de menús.
  • expone el widget de Windows como dll para su uso en Java a través de JNI
  • escribe un widget SWT personalizado para envolverlo y exponer la interfaz de administración de pestañas.

Tengo mucha experiencia en programación Java, programación de GUI con Swing/AWT y programación CIG no GUI. La programación de Windows GUI y SWT son nuevas para mí, así que no estoy seguro de por dónde empezar. Lo mejor que he encontrado hasta ahora es un artículo de 2001 en writing your own SWT widget.

Mi mayor incógnita es la mejor manera de implementar una ventana de aplicación de Windows personalizada.

+0

La manera en que yo entiendo es que sería casi imposible hacer esto con SWT como SWT es más o menos la herramienta de interfaz gráfica de usuario independiente de la plataforma más, y por lo tanto el más estandarizado. Una interfaz gráfica de usuario como Chrome requiere una interfaz mucho más directa con el sistema operativo, ya que no utiliza elementos estándar de la GUI del sistema operativo. De hecho, necesitará escribir su propio administrador de pestañas (y probablemente de ventanas). – HalfBrian

+1

@HalfBrian: en realidad, Swing es el agnóstico más independiente de la plataforma, ya que representa todos los componentes por sí mismo, mientras que SWT usa los componentes del sistema operativo. Naturalmente, eso no hace que el resto de tu comentario sea menos cierto :) –

Respuesta

8

Puede crear una instancia de Shell sin un indicador TITLE y luego mostrar pestañas similares a las de Google-cromo manualmente. De esta forma, incluso puede crear un non-rectangular windows

+0

Gracias Eugene, esto me tiene que mover en la dirección correcta. – MartyC

2

al tratar con cosas que aún no están en la capa JNI de SWT, siempre debe recordar que puede prototipar rápidamente cosas con JNA. Cuando el prototipo JNA, puede ampliar la interfaz nativa de SWT o crear su propia capa JNI (Este es un enfoque que me funcionó varias veces al tratar con widgets SWT Carbon/Cocoa)

+0

No había visto ese proyecto antes, gracias. – MartyC

0

Recomiendo crear un shell sin Trim como el siguiente:

new Shell (display, SWT.NO_TRIM); 

Esto crearía un shell sin la barra de título. Posteriormente puede hacer sus propios botones de cerrar/minimizar/maximizar.

Aquí hay un ejemplo que genera una única barra de progreso sin el negocio de la barra de título.

enter image description here

import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FormAttachment; 
import org.eclipse.swt.layout.FormData; 
import org.eclipse.swt.layout.FormLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.ProgressBar; 
import org.eclipse.swt.widgets.Shell; 

public class ProgressBarGui { 

    Display display; 
    Shell shell; 

    public static void main (String [] args) { 
     final Display display = new Display(); 
     final Shell shell = new Shell (display, SWT.NO_TRIM); 


     //Something to put into shell. 
     shell.setLayout (new FormLayout()); 

     ProgressBar proBar = new ProgressBar (shell, SWT.SMOOTH); 
     proBar.setSelection (50); 
     FormData progBarData = new FormData (100, 20); 
     progBarData.top = new FormAttachment (0); 
     progBarData.left = new FormAttachment (0); 
     proBar.setLayoutData (progBarData); 

     //recompute shell's size and position to fit widget. 
     shell.pack(); 

     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     // region.dispose(); 
     display.dispose(); 
    } 

} 
Cuestiones relacionadas