2009-10-27 6 views
8

alt textComment mettre en œuvre un titre Google chrome comme la barre pour l'application Java SWT

J'ai hérité le développement d'une application Java/SWT fonctionnant sous Windows uniquement. L'une des demandes de fonctionnalités dont j'ai besoin est une barre de titre de type Google-chrome à la place de la barre de titre de Windows SWT. Les onglets de l'application apparaissent au même niveau que les boutons de contrôle de la fenêtre.

Ma compréhension est que je devrai:

  • écrire un widget de Windows capable de rendre l'apparence personnalisée et la gestion des onglets par opposition aux menus.
  • exposer le widget Windows en tant que DLL pour une utilisation en Java via JNI
  • écrire un widget SWT personnalisé pour l'envelopper et exposer l'interface de gestion des onglets.

J'ai beaucoup d'expérience avec la programmation Java, la programmation GUI avec Swing/AWT et la programmation C# non-GUI. Windows GUI programmation et SWT sont nouveaux pour moi, donc je ne sais pas par où commencer. Le meilleur que j'ai trouvé jusqu'à présent est un article de 2001 sur writing your own SWT widget.

Ma plus grande inconnue est la meilleure façon d'implémenter une fenêtre d'application Windows personnalisée.

+0

La façon dont je comprends est qu'il serait presque impossible de le faire avec SWT SWT est à peu près l'outil le plus GUI plate-forme agnostique, et donc les plus normalisés. Une interface graphique comme Chrome nécessite une interface beaucoup plus directe avec le système d'exploitation car elle n'utilise pas les éléments standard de l'interface graphique du système d'exploitation. Vous aurez effectivement besoin d'écrire votre propre gestionnaire d'onglet (et probablement de fenêtre). – HalfBrian

+1

@HalfBrian: En fait, Swing est le plus agnostique de la plate-forme car il restitue tous les composants par lui-même, tandis que SWT utilise les composants du système d'exploitation. Naturellement cela ne rend pas le reste de votre commentaire moins vrai :) –

Répondre

8

Vous pouvez créer une instance Shell sans indicateur TITLE, puis afficher les onglets Google-chrome manuellement. De cette façon, vous pouvez même créer un non-rectangular windows

+0

Merci Eugène, cela m'a fait bouger dans la bonne direction. – MartyC

2

lorsque vous traitez des choses qui ne sont pas encore dans la couche JNI de SWT, vous devez toujours vous rappeler que vous pouvez rapidement prototyper des choses avec JNA. Lorsque le prototype JNA, vous pouvez étendre l'interface native de SWT ou créer votre propre couche JNI (Ceci est une approche qui a bien fonctionné plusieurs fois avec les widgets SWT Carbon/Cocoa)

+0

Je n'avais pas vu ce projet auparavant, merci. – MartyC

0

Je recommande de créer un shell sans trim comme:

new Shell (display, SWT.NO_TRIM); 

Cela créerait un shell sans la barre de titre. Par la suite, vous pouvez créer vos propres boutons de fermeture/réduction/agrandissement.

Voici un exemple qui génère une barre de progression isolée sans la barre de titre.

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(); 
    } 

} 
Questions connexes