Java Swing自定義對話框及作出響應

對話框整個界面採用扁平風格,沒有太多的修飾,四個角進行了圓角處理。使用NetBeans設計。

一、界面設計

要做出這種效果,關鍵有以下幾點:

(1)要去掉JDialog默認的標題欄及邊框

setUndecorated(true);

(2)自己做一個關閉(×)小圖標,放在JLabel中就可以。用NetBeans我們直接可以在圖形化界面設計。

(3)因為我們使用的是扁平風格,所以【確定】【取消】按鈕直接用JLabel而不是JButton。

(4)圓角的實現:

Rectangle bound = getBounds();

AWTUtilities.setWindowShape(this, new RoundRectangle2D.Double(0, 0, bound.width, bound.height, 5, 5));

Advertisements

(5)我們一般還會在按鈕上增加一些效果,比如滑鼠放上去之後改變一下顏色:

private void labelConfirmMouseEntered(java.awt.event.MouseEvent evt) {

labelConfirm.setBackground(MyColor.BUTTON_PRIMARY_HOVER);//具體顏色自己定義

}

private void labelConfirmMouseExited(java.awt.event.MouseEvent evt) {

labelConfirm.setBackground(MyColor.BUTTON_PRIMARY);

Advertisements

}

(6)最後,少不了窗口拖動的效果

private int xOld = 0;

private int yOld = 0;

private void formMousePressed(java.awt.event.MouseEvent evt) {

xOld = evt.getX();

yOld = evt.getY();

}

private void formMouseDragged(java.awt.event.MouseEvent evt) {

int xOnScreen = evt.getXOnScreen();

int yOnScreen = evt.getYOnScreen();

int xx = xOnScreen - xOld;

int yy = yOnScreen - yOld;

MyDialog.this.setLocation(xx, yy);

}

二、響應用戶操作

通常,我們彈出對話框之後,需要根據用戶的操作來作出響應,例如在這個例子中,用戶點擊【確定】之後會退出系統,而點擊【取消】則留在原有界面。

我們的主操作界面一般可能是一個JFrame,然後彈出上面的JDialog,如何將二者聯繫起來呢?有兩種實現方式:

1、使用線程

在主程序中新建一個線程,並設置一個變數傳入Dialog,一直循環等待這個變數的變化。

Thread t = new Thread(new Runnable() {

public void run() {

while (result== null) { //自定義一個變數,在構造JDialog的時候傳進去,然後用死循環一直等待變數的變化

}

if (result.equals("ok")) { //用戶點擊了OK

System.exit(0);

}

}

});

2、使用監聽器

(1)定義一個事件類

這個事件類要繼承EventObject,其中我們將用result變數來保存用戶的操作

public class DialogEvent extends EventObject{

private String result;

public DialogEvent(Object source) {

super(source);

}

public String getResult() {

return result;

}

public void setResult(String result) {

this.result = result;

}

}

(2)定義一個事件監聽器介面

當事件發生的時候,實現這個介面的類將會收到通知,並執行handleEvent中的方法。

public interface DialogListener extends EventListener {

public void handleEvent(DialogEvent event);

}

(3)在自定義的Dialog中,我們要做兩件事:

一是要提供一個方法來讓主界面傳入DialogListener:

private DialogListener listener;

public void setListener(DialogListener listener) {

this.listener = listener;

}

然後,當用戶點擊JDialog中的按鈕時,要觸發事件,並通知Listener

private void labelConfirmMouseClicked(java.awt.event.MouseEvent evt) {

DialogEvent event = new DialogEvent(evt.getSource());

event.setResult("ok");

listener.handleEvent(event); //通知listener處理事件

this.setVisible(false);

}

(4)在主程序中,彈出Dialog之前需要先定義一個DialogListener來處理事件,並將其傳入Dialog

DialogListener listener = new DialogListener() {

@Override

public void handleEvent(FishDialogEvent event) {

if(event.getResult().equals("ok")){

System.exit(0);

}

}

};

MyDialog dialog = new MyDialog();

dialog .setListener(listener);

dialog.setVisible(true);

我們可以將對話框的標題、內容等用變數保存起來,並且設置一個是否顯示【取消】按鈕的變數(對需要確認的對話框使用,提示性的對話框則只需顯示【確定】按鈕),這樣就可以將這個對話框反覆使用了。這個例子,也就是所謂的「觀察者模式」的一次簡單運用。


題外話:

目前很少人使用Java來編寫PC桌面程序,一方面是因為Java需要依賴的runtime實在太過龐大,即使一個很小的程序也要背負一個龐大的身軀。另一方面是因為Java swing提供的默認界面只能用用一個字形容——丑!所以,如果你要開發Java桌面應用,基本上要重新寫一次界面,其中要耗費的成本可想而知。

慶幸的是,Java 9將會使用模塊化來管理各種庫,意味著未來的Java程序將可以瘦身,而且增加了一系列功能,這有可能讓Java能夠在桌面應用方面找回一點尊嚴。據說8月份就會發布,作為Java的鐵杆粉絲,我們拭目以待吧。

Advertisements

你可能會喜歡