創建對話框窗口的主要類。可以使用此類創建自定義的對話框,或者調用 JOptionPane 中的多個類方法來創建各種標准對話框。有關創建對話框的信息,請參閱 The Java Tutorial 中的 How to Make Dialogs 一節。
JDialog 組件包含一個 JRootPane 作為其唯一子組件。contentPane 應該是所有 JDialog 子組件的父級。為了方便使用 add 及其變體,已經重寫了remove 和 setLayout,以在必要時將其轉發到 contentPane。這意味着可以編寫:
dialog.add(child);
******************
java提供了JDialog與JOptionPane供我們使用,事實上,JOptionPane是陽春版的JDialog,當你在使用 JOptionPane時,系統會自動產生JDialog組件,並將JOptionPane的內容放入JDialog的ContentPane中,而這些均由系統在背后自動 運行,並不需要由我們介入。使用JOptionPane的好處是此組件已經默認了許多交互方式,你只用設置想要的顯示模式,JOptionPane 就能輕易的顯示出來,可說相當方便,若這些模式還是無法滿足你的需求,你就可以使用JDialog來自行設計你的對話框。 我們先來看如何構造JDialog,JOptionPane將在后半段介紹:
JDialog構造函數:
- JDialog():建立一個non-modal的對話框,沒有title也不屬於任何事件窗口組件。
- JDialog(Dialog owner):建立一個屬於Dialog組件的對話框,為non-modal形式,也沒有title.
- JDialog(Dialog owner,Boolean modal):建立一個屬於Dialog組件的對話框,可決定modal形式,但沒有title.
- JDialog(Dialog owner,String title):建立一個屬於Dialog組件的對話框,為non-modal形式,對話框上有title.
- JDialog(Dialog owner,String title,Boolean modal):建立一個屬於Dialog組件的對話框,可決定modal形式,且對話框上有 title.
- JDialog(Frame owner):建立一個屬於Frame組件的對話框,為non-modal形式,也沒有title.
- JDialog(Frame owner,Boolean modal):建立一個屬於Frame組件的對話框,可決定modal形式,但沒有title.
- JDialog(Frame owner,String title):建立一個屬於Frame組件的對話框,為non-modal形式,對話框上有title.
- JDialog(Frame owner,String title,Boolean modal):建立一個屬於Frame組件的對話框,可決定modal形式,且對話框上有title. 經常用這個構造函數。
上面所說的modal是一種對話框操作模式,當modal為true時,代表用戶必須結束對話框才能回到原來所屬的窗口。當modal為 false時,代表對話框與所屬窗口可以互相切換,彼此之間在操作上沒有順序性。
一般而言對話框都會依附在某個窗口上,例如JFrame或JDialog,原因在於對話框通常是一個程序運行的過程中與用戶互動的中 間過程,在使用JDialog上跟JFrame非常相似,由上面的JDialog層次結構圖中你可以發現,JDialog是繼承AWT的Dialog類而來,因 此JDialog為一個Heavyweight組件。要加入組件到JDialog上與JFrame是一樣的,你必須先取得JDialog的ContentPane,然后再把組 件加到此ContentPane中,JDialog默認的版面管理器是BorderLayout.
public class DialogDemo extends JDialog {
JLabel about = new JLabel("關於:這可是JAVA寫的連連看哦!");
public DialogDemo()
{
this.setTitle("About");
this.setSize(320, 200);
this.setVisible(true);
this.getContentPane().add(about, BorderLayout.CENTER);
}
public static void main(String[] args)
{
new DialogDemo();
}
}
另一篇文章:
java 自定義確認取消的Dialog對話框,10秒之后自動關閉
問題如下:
點擊一個按鈕,彈出一個對話框,對話框里面包含 確定 和 取消 按鈕
若點擊確定,返回值為0,點擊取消,返回值為1
若超過10秒不點擊,提示窗口自動關閉,返回值為-5
后續可以根據返回值來做各種不同的判斷。
1.TimerTest 主程序,先運行main方法,然后點擊按鈕
package JDialog; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class TimerTest extends JFrame { /** * */ private static final long serialVersionUID = 1L; private static JButton button; private static TimerTest TimerTest; public static void main(String[] args) { TimerTest = new TimerTest(); button = new JButton("按我"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TimeDialog d = new TimeDialog(); int result = d.showDialog(TimerTest, "對方想要和你語音是否接受?", 10);// TimerTest是程序主窗口類,彈出的對話框10秒后消失 System.out.println("===result: "+result); } }); button.setBounds(2, 5, 80,20); TimerTest.getContentPane().setLayout(null); TimerTest.getContentPane().add(button); TimerTest.setSize(new Dimension(400,200)); TimerTest.setLocation(500,200); TimerTest.setVisible(true); TimerTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
package JDialog; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; public class TimeDialog { private String message = null; private int secends = 0; private JLabel label = new JLabel(); private JButton confirm,cancel; private JDialog dialog = null; int result = -5; public int showDialog(JFrame father, String message, int sec) { this.message = message; secends = sec; label.setText(message); label.setBounds(80,6,200,20); ScheduledExecutorService s = Executors.newSingleThreadScheduledExecutor(); confirm = new JButton("接受"); confirm.setBounds(100,40,60,20); confirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { result = 0; TimeDialog.this.dialog.dispose(); } }); cancel = new JButton("拒絕"); cancel.setBounds(190,40,60,20); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { result = 1; TimeDialog.this.dialog.dispose(); } }); dialog = new JDialog(father, true); dialog.setTitle("提示: 本窗口將在"+secends+"秒后自動關閉"); dialog.setLayout(null); dialog.add(label); dialog.add(confirm); dialog.add(cancel); s.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub TimeDialog.this.secends--; if(TimeDialog.this.secends == 0) { TimeDialog.this.dialog.dispose(); }else { dialog.setTitle("提示: 本窗口將在"+secends+"秒后自動關閉"); } } }, 1, 1, TimeUnit.SECONDS); dialog.pack(); dialog.setSize(new Dimension(350,100)); dialog.setLocationRelativeTo(father); dialog.setVisible(true); return result; } }
