JFace中的對話方塊是通過SWT中的Shell 視窗封裝來的,調用的是SWT中的button控制項對象,查看MessageDialog類的原始碼可以發現設定按鈕文字是通過字元常量來設定的,預設為英文。若要顯示中文提示,需加入中文語言套件。
在《Eclipse從入門到精通》(第二版)中,是以Eclipse 3.2.1版本進行說明的。但從Eclipse官網上看,似乎語言套件也只支援到3.2,後續就沒有更新了。幸虧我不需漢化整個Eclipse,而今需讓JFace 的對話方塊顯示中文提示即可。
一、源碼
以InputDialog為例:
InputDialog dialog = new InputDialog(shell, "標題", "請輸入值", "1", null);
if (dialog.open() == InputDialog.OK) {
String valueStr = dialog.getValue();
MessageDialog.openInformation(shell, "標題", "輸入的值為:"+valueStr);
}---------------------------------------------------------------------------------------//“取消”按鈕單擊事件
boolean call = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),"確認","確實要保退出嗎?");
if (call){ //退出
System.exit(0);
}
二、預設狀態
預設顯示為英文:
三、加入中文包
1、下載
雖然Eclipse 3.2版本之後就沒有繼續提供多語言版本,幸好對於RCP程式來說,該語言套件還是有用的。
為:點擊
中文包在NLpack1 裡面。對於RCP程式來說,只需下載NLpack1-eclipse-RCP-3.2-win32.zip即可。
下載後,從壓縮包中提取出org.eclipse.jface.nl1_3.2.0.v200606220026.jar檔案,並放入項目的目錄中。
2、設定項目的庫引用
開啟Eclipse,右鍵點擊項目名稱,選擇“Properties”,點擊“Java Build Path” 下的“Libraries”選項卡:
然後用“Add JARs...”從項目目錄中把上述庫加入,結果如下
:
其它:
16.1 JFace對話方塊概述
◆ ErrorDialog:可根據錯誤層級來顯示錯誤資訊,一般用於Eclipse工作台。
◆ MessageDialog:可顯示提示資訊的對話方塊,類似於SWT的對話方塊,但比SWT功能強大。
◆ MessageDialogWithToggle:一般在儲存喜好設定所設定的值時顯示是否儲存的提示資訊。
◆ ProgressMonitorDialog:可以顯示後台線程進度的對話方塊。
◆ InputDialog:用於輸入資訊的對話方塊,同時可以驗證使用者的輸入,並可以將驗證的資訊顯示在對話方塊中。
◆ PreferenceDialog:專門為設定喜好設定所使用的對話方塊。
◆ TitleAreaDialog:帶有標題、表徵圖和描述資訊的對話方塊。
◆ WizardDialog:嚮導式對話方塊。
16.2 資訊提示對話方塊(MessageDialog)
各種類型的資訊提示對話方塊樣本:
/**
* <p>類功能簡述</p>
* 類的目的介紹等注釋
*
* @author Jif liaojifeng@163.com
* @version v1.0
* @Timer 2011-10-18 上午10:23:30
* ----------------------------------------------------------------------------
* Copyright (c) 2011
* Company * ----------------------------------------------------------------------------
*/
package cn.net.comsys.window;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
public class MessageDialogTest extends ApplicationWindow {
public MessageDialogTest() {
super(null);
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setSize(550,300);
shell.setText("訊息對話方塊樣本");
}
protected Control createContents(Composite parent) {
//視窗中的地區由一個文字框做為訊息輸出台和幾個按鈕分別開啟不同的對話方塊
Composite composite = new Composite( parent ,SWT.NONE);
GridLayout gridLayout = new GridLayout (6,false);
composite.setLayout( gridLayout );
final Text console = new Text ( composite ,SWT.NONE|SWT.READ_ONLY|SWT.V_SCROLL);
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan=6;
console.setLayoutData( data);
Button openError = new Button( composite ,SWT.NONE);
openError.setText("錯誤訊息對話方塊");
openError.addSelectionListener( new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
MessageDialog.openError(Display.getCurrent().getActiveShell(),"錯誤訊息對話方塊","讀取檔案發生錯誤!");
console.append("\n openError對話方塊,返回void");
}
});
Button openConfirm = new Button( composite ,SWT.NONE);
openConfirm.setText("確認訊息對話方塊");
openConfirm.addSelectionListener( new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
boolean b = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
"確認訊息對話方塊",
"確實要儲存檔案嗎?");
console.append("\n openConfirm對話方塊,返回"+b);
}
});
Button openInformation = new Button( composite ,SWT.NONE);
openInformation.setText("訊息對話方塊");
openInformation.addSelectionListener( new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
MessageDialog.openInformation(Display.getCurrent().getActiveShell(),"訊息對話方塊","確實要儲存檔案嗎?");
console.append("\n openInformation對話方塊,返回void");
}
});
Button openQuestion = new Button( composite ,SWT.NONE);
openQuestion.setText("詢問對話方塊");
openQuestion.addSelectionListener( new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
boolean b = MessageDialog.openQuestion(Display.getCurrent().getActiveShell(),"詢問對話方塊","確實要儲存檔案嗎!");
console.append("\n openQuestion對話方塊,返回"+b);
}
});
Button openWarning = new Button( composite ,SWT.NONE);
openWarning.setText("警告對話方塊");
openWarning.addSelectionListener( new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
MessageDialog.openWarning(Display.getCurrent().getActiveShell(),"警告對話方塊","確實要儲存檔案嗎!");
console.append("\n openWarning對話方塊,返回void");
}
});
Button customMessageDig = new Button( composite ,SWT.NONE);
customMessageDig.setText("自訂對話方塊");
customMessageDig.addSelectionListener( new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
MessageDialog dialog = new MessageDialog(Display.getCurrent().getActiveShell(),//shell視窗
"這是對話方塊的標題",//標題
null,//對話方塊的表徵圖,為null則不顯示表徵圖
"這是一個自訂的對話方塊,可以改變按鈕的設定",//對話方塊中的提示資訊
MessageDialog.INFORMATION,//提示資訊的表徵圖
new String[]{"查看","儲存","確認"},//顯示三個按鈕
1);//預設選擇的按鈕的索引值,這裡為1,表示預設選中第二個按鈕,也就是儲存按鈕
int i = dialog.open();//傳回值為按鈕
console.append("\n 自訂對話方塊,返回按鈕的索引值"+i);
}
});
return parent;
}
public static void main(String[] args) {
MessageDialogTest test = new MessageDialogTest();
test.setBlockOnOpen( true );
test.open();
Display.getCurrent().dispose();
}
}