2009-10-27 28 views
8

alt text如何實現對Java SWT應用程序

我繼承只能在Windows上運行一個Java/SWT應用程序的開發谷歌鉻般的標題欄。我需要查看的功能請求之一是代替SWT窗口標題欄的Google-chrome類型標題欄。應用程序的選項卡與窗口控制按鈕出現在同一級別。

我的理解是,我將需要:

  • 編寫Windows控件能夠呈現定製的外觀和管理選項卡,而不是菜單。
  • 通過JNI
  • 暴露的Windows部件如在Java中使用DLL編寫自定義SWT窗口小部件來包裝它和暴露標籤管理界面。

我在Java編程,使用Swing/AWT進行GUI編程以及非GUI C#編程方面擁有豐富的經驗。 Windows GUI編程和SWT對我來說是新的,所以我不知道從哪裏開始。到目前爲止,我發現的最好的是2001年的文章writing your own SWT widget

我最大的未知是實現自定義Windows應用程序窗口的最佳方式。

+0

我的理解是,這將是幾乎不可能用SWT這樣做,因爲SWT幾乎是最具有平臺無關的GUI工具,因此,最規範的方式。像Chrome這樣的GUI需要與操作系統更直接的接口,因爲它不使用標準的OS GUI元素。您將有效地需要編寫自己的選項卡(可能是窗口)管理器。 – HalfBrian

+1

@HalfBrian:實際上Swing是最不依賴平臺的,因爲它自己呈現所有組件,而SWT使用OS組件。當然,這不會使你的評論的其餘部分不真實:) –

回答

8

您可以創建一個沒有TITLE標誌的Shell實例,然後手動呈現Google-chrome-like標籤。這樣,你甚至可以創建一個non-rectangular windows用的東西都還沒有在SWT的JNI層打交道時

+0

感謝尤金,這讓我朝着正確的方向前進。 – MartyC

2

,你應該永遠記住,你可以快速原型事情JNA。當JNA的原型,那麼你可以擴展SWT的本地接口或創建自己的單獨的JNI層(這是一個很好的方法,在處理SWT Carbon/Cocoa小部件時多次運行)

+0

我以前沒見過這個項目,謝謝。 – MartyC

0

我建議創建沒有Trim的外殼就像這樣:

new Shell (display, SWT.NO_TRIM); 

這將創建一個沒有標題欄的shell。隨後,您可以創建自己的關閉/最小化/最大化按鈕。

下面是一個例子,它生成了一個沒有標題欄業務的獨立進度條。

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

}