📄 customdialog.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 + -