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

}