📄 demon.java
字号:
package xq;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Demon extends JPanel implements ActionListener,Runnable {
private Chess chess;
public JButton replay = null,next = null, auto = null, stop = null;
LinkedList 棋谱 = null;
Thread 自动演示 = null;
int index = -1;
ChessBoard board = null;
JTextArea text;
JTextField 时间间隔 = null;
int time = 1000;
String 演示过程 = " ";
JSplitPane splitH = null, splitV = null;
public Demon(ChessBoard board) {
// TODO 自动生成构造函数存根
this.board = board ;
replay = new JButton("重新演示");
next = new JButton("下一步");
auto = new JButton("自动演示");
stop = new JButton("暂停演示");
自动演示 = new Thread(this);
replay.addActionListener(this);
next.addActionListener(this);
auto.addActionListener(this);
stop.addActionListener(this);
text = new JTextArea();
时间间隔 = new JTextField("1");
setLayout(new BorderLayout());
JScrollPane pane = new JScrollPane(text);
text.setEditable(false);
text.setLineWrap(true);
JPanel p = new JPanel(new GridLayout(3,2));
p.add(next);
p.add(replay);
p.add(auto);
p.add(stop);
p.add(new JLabel("时间间隔(秒)",SwingConstants.CENTER));
p.add(时间间隔);
splitV = new JSplitPane(JSplitPane.VERTICAL_SPLIT, pane, p);
splitH = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, board, splitV);
splitV.setDividerSize(5);
splitV.setDividerLocation(400);
splitH.setDividerSize(5);
splitH.setDividerLocation(460);
add(splitH, BorderLayout.CENTER);
validate();
}
public void set棋谱(LinkedList 棋谱){
this.棋谱 = 棋谱;
}
public char numberToLetter(int n){//将数字对应到字母的方法
char c = '\n';
switch(n){
case 1: c = 'A';break;
case 2: c = 'B';break;
case 3: c = 'C';break;
case 4: c = 'D';break;
case 5: c = 'E';break;
case 6: c = 'F';break;
case 7: c = 'G';break;
case 8: c = 'H';break;
case 9: c = 'I';break;
case 10: c = 'J';break;
}
return c;
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == next){
index++;
if(index < 棋谱.size()){
演示一步(index);
}
else{
演示结束("棋谱演示完毕");
}
}
if(e.getSource() == replay){
board = new ChessBoard(chess,45, 45, 9, 10);
splitH.remove(board);
splitH.setDividerSize(5);
splitH.setDividerLocation(460);
splitH.validate();
text.setText(null);
}
if(e.getSource() == auto){
next.setEnabled(false);
replay.setEnabled(false);
try{
time = 1000*Integer.parseInt(时间间隔.getText().trim());
}catch(NumberFormatException ee){
time = 1000;
}
if(!(自动演示.isAlive())){
//如果没有,则启动一个新的演示线程
board = new ChessBoard(chess,45, 45, 9, 10);
splitH.remove(board);
splitH.setDividerSize(5);
splitH.setDividerLocation(460);
splitH.setLeftComponent(board);
splitH.validate();
自动演示.start();
}
}
if(e.getSource() == stop){
if(e.getActionCommand().equals("暂停演示")){
演示过程 = "暂停演示";
stop.setText("继续演示");
stop.repaint();
}
if(e.getActionCommand().equals("继续演示")){
演示过程 = "继续演示";
自动演示.interrupt();
stop.setText("暂停演示");
stop.repaint();
}
}
}
public synchronized void run(){
for(index = 0; index < 棋谱.size(); index++){
try{
Thread.sleep(time);
}catch(InterruptedException e){
}
while(演示过程.equals("暂停演示")){
try{
wait();
}catch(InterruptedException e){
notifyAll();
}
}
演示一步(index);
}
if(index >= 棋谱.size()){
演示结束("棋谱演示完毕");
next.setEnabled(true);
replay.setEnabled(true);
}
}
public void 演示一步(int index){
MoveStep step = (MoveStep)棋谱.get(index);
Point pStart = step.pStart;
Point pEnd = step.pEnd;
int startI = pStart.x;
int startJ = pStart.y;
int endI = pEnd.x;
int endJ = pEnd.y;
ChessPiece piece = (board.point)[startI][startJ].getPiece();
if((board.point)[endI][endJ].isPiece()){
ChessPiece pieceRemoved = (board.point)[endI][endJ].getPiece();
(board.point)[endI][endJ].reMovePiece(pieceRemoved, board);
board.repaint();
(board.point)[startI][startJ].setPiece(piece, board);
(board.point)[startI][startJ].set有棋子(false );
board.repaint();
}
else{
(board.point)[endI][endJ].setPiece(piece, board);
(board.point)[startI][startJ].set有棋子(false);
}
String 棋子类别 = piece.棋子类别();
String name = piece.getName();
String m = " #" + 棋子类别 + name + " : " +
startI + numberToLetter(startJ) + "到" + endI + numberToLetter(endJ);
text.append(m);
if(piece.棋子类别().equals(board.黑方颜色))
text.append("\n");
}
public void 演示结束( String message){
splitH.remove(board);
splitH.setDividerSize(5);
splitH.setDividerLocation(460);
JLabel label = new JLabel(message);
label.setFont(new Font("隶书",Font.BOLD,40));
label.setForeground(Color.blue);
label.setHorizontalAlignment(SwingConstants.CENTER);
splitH.setLeftComponent(label);
splitH.validate();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -