📄 chessframe.java
字号:
/**
* @(#)ChessFrame.java
*
*
* @author
* @version 1.00 2008/4/11
*/
//package fivechess;
import javax.swing.JFrame;
import java.awt.HeadlessException;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.*;
import java.io.*;
public class ChessFrame extends JFrame implements ActionListener
{
//背景音乐
private Sound backsound = new Sound("aa.mid");
private String[] strsize = {"20*15","30*20","40*30"};
private String[] strmode = {"人机对弈"};
private int width,height;
private ChessModel cm;
private MainPanel mp;
private final int DEFAULT_PORT = 5454;
private ServerSocket serversocket;
private Socket clientsocket;
private SocketThread socketthread;
private InputStream in;
private OutputStream out;
private JMenuItem serverMenuItem;
private JMenuItem connectMenuItem;
private JMenuItem disconnectMenuItem;
private JMenuItem boardMenuItem;
private JMenu localchessMenu;
public static boolean iscomputer = true,checkcomputer = true;
//标志是否是本地人机对弈,程序运行后,默认是本地人机对弈
public static boolean isnet = false;
public static boolean isserver = true;
public static boolean istoken = true;
public ChessFrame(String title)
{
super(title);
cm = new ChessModel(1);
mp = new MainPanel(this,cm);
Container com = this.getContentPane();
com.add(mp,"Center");
this.setResizable(false);
this.addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
MapSize(20,15);
JMenuBar mbar = new JMenuBar();
this.setJMenuBar(mbar);
//游戏菜单
JMenu gameMenu = new JMenu("游戏");
mbar.add(makeMenu(gameMenu,new Object[]
{
"开局","棋盘",null,"音乐",null,"退出"
},this));
boardMenuItem = gameMenu.getItem(1);
//视图菜单
JMenu lookMenu = new JMenu("视图");
mbar.add(makeMenu(lookMenu,new Object[]
{
"Metal","Motif","Windows"
},this));
//本地对弈菜单
JMenu localMenu = new JMenu("视图");
mbar.add(makeMenu(lookMenu,new Object[]
{
"本地对弈"
},this));
localchessMenu = localMenu;
//网络对弈菜单
JMenu netMenu = new JMenu("网络对弈");
mbar.add(makeMenu(netMenu,new Object[]
{
"启动服务器","连接服务器","终端服务器"
},this));
serverMenuItem = netMenu.getItem(0);
connectMenuItem = netMenu.getItem(1);
disconnectMenuItem = netMenu.getItem(2);
disconnectMenuItem.setEnabled(false);
//程序运行开始时,中断连接菜单项不可用
//帮助菜单
JMenu helpMenu = new JMenu("帮助");
mbar.add(makeMenu(helpMenu,new Object[]
{
"关于"
},this));
// backsound.hasPlayed = true;
// backsound.loop();
this.show();
}
//设置菜单的方法
public JMenu makeMenu(Object parent,Object items[],Object target)
{
JMenu m = null;
if(parent instanceof JMenu)
m = (JMenu)parent;
else if(parent instanceof String)
m = new JMenu((String)parent);
else
return null;
for(int i = 0;i < items.length; i++)
if(items[i] == null)
m.addSeparator();
else if(items[i] == "棋盘")
{
JMenu jm = new JMenu("棋盘");
ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem rmenu;
for(int j=0;j<strsize.length;j++)
{
rmenu=makeRadioButtonMenuItem(strsize[j],target);
if (j==0) rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
}
else if(items[i] == "本地对弈")
{
ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int h=0;h<strmode.length;h++)
{
rmenu = makeRadioButtonMenuItem(strmode[h],target);
if (h==0) rmenu.setSelected(true);
m.add(rmenu);
group.add(rmenu);
}
}
else
m.add(makeMenuItem(items[i],target));
return m;
}
//设置菜单项的方法
public JMenuItem makeMenuItem(Object item,Object target)
{
JMenuItem r = null;
if(item instanceof String )
r = new JMenuItem((String)item);
else
if(item instanceof JMenuItem)
r = (JMenuItem)item;
else
return null;
if (target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
//设置单选菜单项的方法
public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item,Object target)
{
JRadioButtonMenuItem r = null;
if(item instanceof String)
r = new JRadioButtonMenuItem((String)item);
else
if(item instanceof JRadioButtonMenuItem)
r = (JRadioButtonMenuItem)item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
// 以w为宽,以h为长刷新棋盘
//网络对战时,此功能不可用
public void MapSize(int w,int h)
{
setSize(w*20+50,h*20+100);
if(this.checkcomputer)
this.iscomputer = true;
else
this.iscomputer = false;
mp.setMode(cm);
mp.repaint();
}
public boolean getiscomputer()
{
return this.iscomputer;
}
public void restart()
{
int degree = cm.getDegree();
if(degree <= 3&& degree >=1)
{
cm = new ChessModel(degree);
MapSize(cm.getWidth(),cm.getHeight());
}
else
{
System.out.println("\u81EA\u5B9A\u4E49");
}
}
//菜单事件的处理
public void actionPerformed(ActionEvent e)
{
String arg = e.getActionCommand();
//视图菜单中的各类单项的处理,选中某一项后,改变为相应的窗口风格
try
{
if(arg.equals("Windows"))
UIManager.setLookAndFeel
("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
else if(arg.equals("Motif"))
UIManager.setLookAndFeel
("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
else
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch (Exception ee)
{
System.out.println(ee);
}
//棋盘菜单中各菜单项的处理,选中某一项后,重新设置棋盘,并看是新的一局
//网络对战时,不可改变棋盘的大小,即网络对战时棋盘菜单不可用
if(arg.equals("20*15"))
{
this.width = 20;
this.height = 15;
cm = new ChessModel(1);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if(arg.equals("30*20"))
{
this.width = 30;
this.height = 20;
cm = new ChessModel(2);
MapSize(this.width,this.height);
SwingUtilities.updateComponentTreeUI(this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -