(一)实现基本界面之前需要知道的
五子棋界面与之前的画图板程序相比功能多了不少,如果对图形界面了解得不是很清晰实现起来将会非常困难。所以在正式开始之前有必要回顾学过的东西。
一、 Java的图形界面实现自我感觉就是不断地往一个框架上添加各种组件。打个比方,好比满汉全席和家常菜,二者的不同是因为放在桌子上的菜肴不同,而且前者有更多的辅助的东西存在。但是本质上,它们都是放在桌子上的菜。在Java里也差不多是这样的。
JFrame——窗体容器组件类,等效于桌子。桌子在摆菜时不会堆起来放,所以JFrame也不应该互相添加。
JPanel——面板组件类,等效于一个个的盘子或者碗,用来往里面放其他东西。而JPanel应该怎么放置则取决于JFramed的布局是怎么设置的。
BorderLayout——边框布局,分为东南西北中五块。如果JFrame设置的是这个布局,则往JFrame上添加组件(Panel等等)时则必须指明放在哪块。它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件,并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER。当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一,例如:
Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add(new Button("Okay"),BorderLayout.SOUTH) ;
FlowLayout——流式布局,直到放满为止(之前已有不再赘述)。
setsize,setPreferredSize—— 设置大小 (区别放在文末)。
JButton——按钮组件。
JComboBox——下拉菜单控件。要设置菜单的内容可以先开一个字符串数组然后将其作为参数赋给对象。代码如下:
String[] itemArray = { "人人对战", "人机对战" };
JComboBox<String> cbItem = new JComboBox<String>(itemArray);
(二)开始画出一个棋盘
我想实现的棋盘界面如下图所示,当然具体的颜色大小啦什么的可以自己改变。
第一部分代码我们暂时只是画出来,不考虑监听的问题。
package GoBang;
import static GoBang.GoBangconfig.x;
import static GoBang.GoBangconfig.y;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GoBang extends JPanel implements GoBangconfig {
public int[][] isArrive = new int[15][15];
public static void main(String[] args) {
GoBang gf = new GoBang();
gf.initUI();
}
public void initUI() {
//jf的基本操作
JFrame jf = new JFrame();
jf.setTitle("五子棋游戏");// 设置标题
jf.setSize(700, 600);// 设置大小
jf.setLocationRelativeTo(null);// 显示位置
jf.setDefaultCloseOperation(3);// 关闭操作
jf.getContentPane().setBackground(Color.gray); //给jf设置背景色
jf.setLayout(new BorderLayout()); //jf设置为流式布局
Dimension dim1 = new Dimension(150, 0);// 设置右半panel的大小 (设置为0是因为此处的高度是和jf的高度相同,是不起作用的)
Dimension dim2 = new Dimension(140, 40);// 设置右边按钮的大小
// 实现左半部分的功能
this.setBackground(Color.gray);
jf.add(this, BorderLayout.CENTER);// 将棋盘添加到框架布局的中间位置
// 设置右半部分的颜色及布局
JPanel jp1 = new JPanel();
jp1.setPreferredSize(dim1);
jp1.setBackground(Color.DARK_GRAY);
jf.add(jp1, BorderLayout.EAST);
FlowLayout F1 = new FlowLayout();
jp1.setLayout(F1);// 设置流式布局
// 设置下拉菜单按钮
String[] choose = { "人人对战", "人机对战" };
JComboBox<String> box = new JComboBox<String>(choose);
// 设置三个普通按钮
String[] typeArray = { "开始新游戏", "悔棋", "认输" };
frameListener butjtq = new frameListener(this, box);
for (int i = 0; i < typeArray.length; i++) {
JButton but = new JButton(typeArray[i]);
but.setPreferredSize(dim2);
jp1.add(but);
// but.addActionListener(butjtq);
}
jp1.add(box);
jf.setVisible(true); //设置为可见,很重要
}
public void paint(Graphics gr) {
super.paint(gr);
Graphics2D g=(Graphics2D)gr;
// 重绘棋盘
g.setColor(Color.black);
for (int i = 0; i < row; i++){
g.drawLine(x, y + size * i, x + size * (column - 1), y + size * i);
g.drawLine(x + size * i, y, x + size * i, y + size * (row - 1));
}
// 重绘棋子
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++) {
if(isArrive[i][j]!=0){
int countx = size * j + x- size / 2;
int county = size * i + y - size / 2;
if (isArrive[i][j] == 1) //黑棋为1
g.setColor(Color.black);
else if (isArrive[i][j] == 2) //白棋为2
g.setColor(Color.white);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON); //抗锯齿
g.fillOval(countx , county, size, size); //填充棋子
}
}
}
}
当上面的代码执行完之后,一个五子棋的棋盘就已经完成了,如下图所示:
To be continued...
第(二)部分将继续讲让棋盘能够下棋的具体操作——添加Gobang Listener
附:关于设置大小,区分一下setSize和setPreferredSize
1、setPreferredSize需要在使用布局管理器的时候使用,布局管理器会获取空间的preferredsize,因而可以生效。例如 borderlayout在north中放入一个panel,panel的高度可以通过这样实现:panel.setPreferredSize(new Dimension (0, 100));这样就设置了一个高度为100的panel,宽度随窗口变化。 2、setSize,setLocation,setBounds方法需要在不使用布局管理器的时候使用,也就是setLayout(null)的时候可以使用这 个方法控制布局。 3 、setSize(包括setLocation)在绝对布局中才能生效。也就是在容器【常见为JPanel】中调用setLayout(null);方法才 能生效。这样的弊端是:设置为绝对布局,则意味着不能实现响应式布局。即不管JFrame变的多大,控件还保持着设定的 大小。 4、setPreferredSize意味着先获取容器【常见为JPanel】的空间大小,控件的大小即为容器的大小。所以我们可以通过设 定容器【常见为JPanel】的大小,再去控制控件的大小。
就目前Java的代码水平可以简单地理解为JFrame应该使用setSize来控制大小,而其他组件都是需要先建立new一个Dimension类的对象dim1,再用setPreferredSize()。比如:
JPanel eastPane = new JPanel();
eastPane.setPreferredSize(new Dimension(150, 0));