Java Swing 自定義Dialog確認對話框

Java Swing 自定義Dialog

  • 需求:當點擊JFrame窗口的關閉按鈕時,彈框詢問是否確定關閉窗口,如果是則關閉程序,否就讓彈框消失什麼也不做(使用Dialog)。
  • 分析:雖然Java提供了 JOptionPane 類,用來創建標準對話框,但是此處需要使用Dialog來提供彈框。所以可以通過擴展 JDialog 類創建自定義的對話框。
    實現如下:
package com.tianjh.dialog;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 * @author tianjh
 * @date 2021/3/8
 * 當點擊JFrame窗口的關閉按鈕時,觸發窗口監聽事件
 * 彈框詢問是否真的需要關閉程序
 */
public class MyDialog extends JFrame {
    JPanel jPanel;
    static final String TITLE = "提示";
    static final String CONTENT = "確定要關閉JFrame窗口嗎?";

    public MyDialog() {
        jPanel = new JPanel();
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                new CustomDialog(TITLE, CONTENT).setVisible(true);
            }
        });
        JButton jButton = new JButton("點我或關閉按鈕看看效果");
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new CustomDialog(TITLE, CONTENT).setVisible(true);
            }
        });
        jPanel.add(jButton,BorderLayout.CENTER);
        add(jPanel);
        setTitle("JFrame窗口");
        setSize(500, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MyDialog();
    }

}

/**
 * 自定義Dialog對話框
 */
class CustomDialog extends JDialog implements ActionListener {
    String title;
    String content;
    String ok = "確定";
    String cancel = "取消";

    public CustomDialog(String title, String content) {
        this.title = title;
        this.content = content;
        int width = 45, height = 45;
        // 創建1個圖標實例,注意image目錄要與src同級
        ImageIcon icon = new ImageIcon("image//tu.png");
        icon.setImage(icon.getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT));
        // 1個圖片標籤,顯示圖片
        JLabel jlImg = new JLabel(icon);
        jlImg.setSize(width, height);
        jlImg.setBounds(20, 44, width, height);
        // 1個文字標籤,顯示文本
        JLabel jLabel = new JLabel(content);
        jLabel.setFont(new Font("", Font.PLAIN, 14));
        // 設置文字的顏色為藍色
        jLabel.setForeground(Color.black);
        jLabel.setBounds(75, 43, 180, 45);
        JButton okBut = new JButton(ok);
        JButton cancelBut = new JButton(cancel);
        okBut.setBackground(Color.LIGHT_GRAY);
        okBut.setBorderPainted(false);
        okBut.setBounds(65, 126, 98, 31);
        cancelBut.setBounds(175, 126, 98, 31);
        cancelBut.setBackground(Color.LIGHT_GRAY);
        cancelBut.setBorderPainted(false);
        // 給按鈕添加響應事件
        okBut.addActionListener(this);
        cancelBut.addActionListener(this);
        // 向對話框中加入各組件
        add(jlImg);
        add(jLabel);
        add(okBut);
        add(cancelBut);
        // 對話框流式布局
        setLayout(null);
        // 窗口左上角的小圖標
        setIconImage(icon.getImage());
        // 設置標題
        setTitle(title);
        // 設置為模態窗口,此時不能操作父窗口
        setModal(true);
        // 設置對話框大小
        setSize(300, 210);
        // 對話框局域屏幕中央
        setLocationRelativeTo(null);
        // 對話框不可縮放
        setResizable(false);
        // 點擊對話框關閉按鈕時,銷毀對話框
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    /**
     * 當按鈕被點擊時會執行下面的方法
     *
     * @param e 事件
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        // 判斷是不是確定按鈕被點擊
        if (ok.equals(e.getActionCommand())) {
            // 對話框不可見
            this.setVisible(false);
            System.out.println("我退出程序了...");
            System.exit(0);
        }
        if (cancel.equals(e.getActionCommand())) {
            this.setVisible(false);
            this.dispose();
            System.out.println("我啥也沒幹...");
        }
    }
}
  • JFrame界面如下所示:
    在這裡插入圖片描述
  • 點擊JFrame窗口中的按鈕或者關閉按鈕即可觸發確認對話框,點擊之後的結果如下:
    在這裡插入圖片描述
  • 如果點擊確定,則退出該程序,否則退回到Jframe窗口撒事也不幹。