代码改变世界

java swing JDialog 使用

2012-11-27 21:09  youxin  阅读(14364)  评论(0编辑  收藏  举报

创建对话框窗口的主要类。可以使用此类创建自定义的对话框,或者调用 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;  
        
    }

}