1.建新的界面,界面中有两个面板(属性:背景颜色等)一个是按钮面板btnPanel,一个是棋盘(chessPanel)其中类ChessPanel 继承JPanel;
代码—
public class LayoutUI {
public static void main(String[] args) {
LayoutUI ly=new LayoutUI();
ly.showUI();
}
ChessListener cl=new ChessListener();//监听器
public void showUI(){
JFrame jf=new JFrame();
jf.setTitle("五子棋总结");
jf.setDefaultCloseOperation(3);
jf.setSize(700,600);
//添加两个画板
JPanel btnPanel=new JPanel();
ChessPanel chessPanel=new ChessPanel();//继承了Jpanel
btnPanel.setBackground(Color.white);
chessPanel.setBackground(Color.lightGray);
jf.add(btnPanel, BorderLayout.EAST);
jf.add(chessPanel,BorderLayout.CENTER);
initButtonPanel(btnPanel,cl);//添加按钮面板
jf.setVisible(true);
2.按钮面板btnPanel创立两个面板(njp,sjp)有按钮(颜色、背景、大小),按钮需要添加按钮的ActionListenner动作监听器)——采用封装的方法
代码二:
public void initButtonPanel(JPanel btnPanel,ActionListener al){//动作监听器
Dimension dim=new Dimension(120,0);
Dimension dim1=new Dimension(0,250);//南北只能设置高度,东西只设置宽度
btnPanel.setPreferredSize(dim);//南北只能设置高度,东西只设置宽度
btnPanel.setLayout(new BorderLayout());//获得一个布局,新的边框布局//要不然显示不出来
JPanel njp=new JPanel();
JPanel sjp=new JPanel();
njp.setPreferredSize(dim1);
sjp.setPreferredSize(dim1);
//背景颜色
njp.setBackground(Color.ORANGE);
sjp.setBackground(Color.pink);
btnPanel.add(njp,BorderLayout.NORTH);
btnPanel.add(sjp,BorderLayout.SOUTH);
String[] str=new String[]{"开始游戏","悔棋","退出","认输","你真好看"};
for(int i=0;i< str.length;i++){
initButton(njp,Color.white,str[i],cl);//这里必须用cl,要不然还是监听不到
}
}
(1)其中按钮的名字可以用一维数组来添加名字(string[] strs=new string[]{" "," "}; )封装起来在initBttoonPanel里用,封装如下
public void initButton(JPanel jp,Color color,String name,ActionListener al){
JButton jbu=new JButton(name);//按钮
Dimension dim2=new Dimension(110,30);
jbu.setPreferredSize(dim2);
jbu.addActionListener(al);//这里只是一个那个添加监听器对象
jp.add(jbu);
}
(2)btnPanel面板也需要获取边框布局(setLayout(new BorderLayout)),要不然JPanel默认为流式布局;
3.在棋盘面板下棋,需要在棋盘面板在获取画笔(Graphics g=chessPanel.getGraphics),把画笔的g传到监听器中,用来绘画圆,直线都可以。
//UI界面
Graphics g=chessPanel.getGraphics();
cl.g=g;//监听器cl获取到了画笔g
chessPanel.addMouseListener(cl);//棋盘chessPanel添加鼠标监听器
(1)用setGraphics(Graphics g){this.g=g}函数来获取
//ChessListener界面
Graphics g;//传画笔
public void setGraphics(Graphics g) {
this.g = g;
System.out.println("g="+g);
}
(2)在UI界面中监听器cl.g=g;//赋值
4.实现轮流下棋以及重绘
(1)用二维数组的方法视线重绘;
((1))在chessPanel继承JPanel,在这里重写paint方法,建立一个数组int arr1[][]用for循环重绘
//chessPanel界面
import javax.swing.*;
import java.awt.*;
public class ChessPanel extends JPanel implements GoBangconfig{
int[][] arr1;
Image image1 = new ImageIcon("D:\图片\black.png").getImage();
Image image2 = new ImageIcon("D:\图片\white.png").getImage();
public void paint(Graphics g){
super.paint(g);
for(int i=0;i<=C;i++){
g.drawLine(X,Y+i*SIZE,X+C*SIZE,Y+i*SIZE);
g.drawLine(X+i*SIZE,Y,X+i*SIZE,Y+R*SIZE);
}
for(int i=0;i< arr1.length;i++){
for(int j=0;j< arr1.length;j++){
if(arr1[i][j]==1){
g.drawImage(image1, i*SIZE+X - SIZE / 2, j*SIZE+Y - SIZE / 2, 60, 60, null);
}
if(arr1[i][j]==2){
g.drawImage(image2, i*SIZE+X - SIZE / 2, j*SIZE+Y - SIZE / 2, 60, 60, null);
}
}
}
}
}
((2));在监听器接面用数组arr1[][]实现不能在同一个地方下棋功能,需要从UI界面获取对象chessPanel,然后才能传数组到ChessPanel的arr1[][]里面,在UI界面用cl.setChessPanel(chessPanel)才能获得那个chessPanel 对象;才能调用监听器中的arr1[];
UI界面
// cl.chessPanel=chessPanel;//这个方法重绘的时候数组传不过去
//把chessPanel这个对象传到监听器里这样才能获取数组
cl.setChessPanel(chessPanel);//监听器通过set方法才能在cl里获得chessPannel
ChesssListener界面
//用二维数组重绘棋子
ChessPanel chessPanel;//传对象
int[][] arr1=new int[10][10];
public void setChessPanel(ChessPanel chessPanel){
this.chessPanel=chessPanel;
ch
5.实现悔棋(悔黑下黑)
(3)创建一个悔棋的类UnDo(行列 数)
public class UnDo {
int ChessLine;//行
int Chesscolumn;//列
int Chessnum;//个数
boolean isBlack;
public UnDo(int ChessLine, int Chesscolumn, int Chessnum,boolean isBlack){
this.ChessLine=ChessLine;
this.Chesscolumn=Chesscolumn;
this.Chessnum=Chessnum;
this.isBlack=isBlack;
}
}
(2)队列 ArrayList
ArrayListunDoArrayList=new ArrayList<>();
(3)在画圆面后把创建一个新的对象 UnDo un_black=new UnDo来获取下完的那颗棋子的行列值以及数!在把这个对象添加到队列里面(先进后出);
UnDo un_black=new UnDo(ChessX,ChessY,chessFlag,isBlack);
unDoArrayList.add(un_black);
(4)在actionPerformed的函数中
if(strs.equals("悔棋")){
int size=unDoArrayList.size();
UnDo unDo=unDoArrayList.get(size-1);
arr1[unDo.chessLine][unDo.chesscolumn]=0;
unDoArrayList.remove(size-1);
isBlack=unDO.isBlack
chessPanel.repaint();
}
暂时先写到这!后面更新功能;



