⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 customdialog.java

📁 用java实现的全真模拟windows下的扫雷程序。不过目前实现以button方式实现。改进可以考虑以位图形式实现
💻 JAVA
字号:
/*
 * CustomDialog.java 1.0 2003-06-25
 *
 * Copyleft (c) 2003 RatKing.
 */

package jmine;

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

/**
 * “自定义雷区”对话框
 *
 * @author <a href="ratking@ynet.com">RatKing</a>
 * @version 1.0
 */
public class CustomDialog extends JDialog {
    private final int DEFAULT_ROWS      = 9;
    private final int DEFAULT_COLUMNS   = 9;
    private final int DEFAULT_MINES     = 9;
    private final int MAX_ROWS          = 24;
    private final int MAX_COLUMNS       = 30;
    private final int MAX_MINES         = 667;
    private final int MIN_ROWS          = 9;
    private final int MIN_COLUMNS       = 9;
    private final int MIN_MINES         = 10;

    int rows    = DEFAULT_COLUMNS;
    int columns = DEFAULT_COLUMNS;
    int mines   = DEFAULT_MINES;

    JLabel rowsLabel    = new JLabel("高度(H):");
    JLabel columnsLabel = new JLabel("宽度(W):");
    JLabel minesLabel   = new JLabel("雷数(M):");

    JTextField rowsField = new JTextField(5);
    JTextField columnsField = new JTextField(5);
    JTextField minesField = new JTextField(5);

    JButton okButton = new JButton("确定(O)");
    JButton cancelButton = new JButton("取消(C)");

    public CustomDialog() {
        this((Frame) null);
    }

    public CustomDialog(Frame owner) {
        super(owner, "自定义雷区", true);
        init();
    }

    private void init() {
        rowsField.setText(Integer.toString(rows));
        columnsField.setText(Integer.toString(columns));
        minesField.setText(Integer.toString(mines));

        rowsField.addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                JTextField tf = (JTextField) e.getSource();
                tf.selectAll();
            }
        });
        columnsField.addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                JTextField tf = (JTextField) e.getSource();
                tf.selectAll();
            }
        });
        minesField.addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                JTextField tf = (JTextField) e.getSource();
                tf.selectAll();
            }
        });

        rowsLabel.setLabelFor(rowsField);
        columnsLabel.setLabelFor(columnsField);
        minesLabel.setLabelFor(minesField);

        rowsLabel.setDisplayedMnemonic(KeyEvent.VK_H);
        columnsLabel.setDisplayedMnemonic(KeyEvent.VK_W);
        minesLabel.setDisplayedMnemonic(KeyEvent.VK_M);

        JPanel p1 = new JPanel(new GridLayout(3, 2, 5, 5));
        JPanel p2 = new JPanel();
        p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));

        okButton.setMnemonic(KeyEvent.VK_O);
        cancelButton.setMnemonic(KeyEvent.VK_C);
        okButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                measure();
                dispose();
            }
        });
        cancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });

        // 添加提示信息
        rowsLabel.setToolTipText("<html><font size=3>游戏区域中纵向方块的数量。</font></html>");
        rowsField.setToolTipText("<html><font size=3>游戏区域中纵向方块的数量。</font></html>");
        columnsLabel.setToolTipText("<html><font size=3>游戏区域中横向方块的数量。</font></html>");
        columnsField.setToolTipText("<html><font size=3>游戏区域中横向方块的数量。</font></html>");
        minesLabel.setToolTipText("<html><font size=3>游戏区域中地雷的数量。</font></html>");
        minesField.setToolTipText("<html><font size=3>游戏区域中地雷的数量。</font></html>");
        okButton.setToolTipText("<html><font size=3>关闭该对话框并保存所作的更改。</font></html>");
        cancelButton.setToolTipText("<html><font size=3>关闭该对话框,但不保存任何更改。</font></html>");

        // 设置字体
        Font font = JMine.defaultFont;
        rowsLabel.setFont(font);
        rowsField.setFont(font);
        columnsLabel.setFont(font);
        columnsField.setFont(font);
        minesLabel.setFont(font);
        minesField.setFont(font);
        okButton.setFont(font);
        cancelButton.setFont(font);

        p1.add(rowsLabel);
        p1.add(rowsField);
        p1.add(columnsLabel);
        p1.add(columnsField);
        p1.add(minesLabel);
        p1.add(minesField);
        p2.add(Box.createVerticalGlue());
        p2.add(okButton);
        p2.add(Box.createVerticalGlue());
        p2.add(cancelButton);
        p2.add(Box.createVerticalGlue());

        JPanel contentPane = (JPanel) getContentPane();
        BorderLayout borderLayout = (BorderLayout) contentPane.getLayout();
        borderLayout.setHgap(10);
        contentPane.setBorder(BorderFactory.createEmptyBorder(20, 10, 20, 10));
        contentPane.add(p1, BorderLayout.CENTER);
        contentPane.add(p2, BorderLayout.EAST);

        getRootPane().setDefaultButton(okButton);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);

        pack();
        okButton.requestFocus();
    }

    public int getRows() {
        return rows;
    }

    public int getColumns() {
        return columns;
    }

    public int getMines() {
        return mines;
    }

    public void setRows(int rows) {
        this.rows = rows;
        rowsField.setText(Integer.toString(rows));
    }

    public void setColumns(int columns) {
        this.columns = columns;
        columnsField.setText(Integer.toString(columns));
    }

    public void setMines(int mines) {
        this.mines = mines;
        minesField.setText(Integer.toString(mines));
    }

    private void measure() {
        rows = getNumber(rowsField.getText());
        columns = getNumber(columnsField.getText());
        mines = getNumber(minesField.getText());

        if (rows < MIN_ROWS)
            rows = MIN_ROWS;
        if (rows > MAX_ROWS)
            rows = MAX_ROWS;
        if (columns < MIN_COLUMNS)
            columns = MIN_COLUMNS;
        if (columns > MAX_COLUMNS)
            columns = MAX_COLUMNS;
        if (mines < MIN_MINES)
            mines = MIN_MINES;
        if (mines > MAX_MINES)
            mines = MAX_MINES;

        int maxMines = (int) (rows * columns * 0.8);
        if (mines > maxMines)
            mines = maxMines;
    }

    /**
     * 将字符串转换成整数。
     * 转换前,首先除去字符串首尾的空格,并截去不是数字的后面的部分
     */
    private int getNumber(String str) {
        if (str == null)
            return 0;
        str = str.trim();

        int i;
        for (i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i)))
                break;
        }
        str = str.substring(0, i);

        int n = 0;
        try {
            n = Integer.parseInt(str);
            // if (n < 0) n = -n;
        } catch  (NumberFormatException e) {
            // skip
        }

        return n;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -