首先要知道,我们的按键点完之后有反馈,在java中用ActionListener接口可以实现按键的监听,同时,我们需要对棋盘进行操作,所以我们在对按键进行监听注册的时候,就希望能实现两个接口,所以可以用一个类来表示
这是自己定义的实现了两个接口的类,我们之后注册按键的时候用这个类
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
//因为不止要实现按键监听,还需要对board进行绘制,所以不直接用ActionListener,而是新建一个类来应用board和按键的接口
public class ButtonListener implements BoardDraw, ActionListener {
//ButtonListener的构造函数
public ButtonListener(BoardDraw bd){
this.bd =bd;//就把这个看成python中的self吧
}
//当有操作发生的时候,界面发生的变化
@Override
public void actionPerformed(ActionEvent e) {
}
}
再来一个BoardDraw的接口进行初始化棋盘
public interface BoardDraw {
int x=50,y=50,size=40,row=15,col=15;//初始化棋子区域的一些参数
}
完事儿之后,在上一篇写的程序中,进行按键的注册
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionListener;
public class Board extends JPanel implements BoardDraw{
public static void main (String args[]){
Board gb = new Board();//首先初始化一个五子棋的对象
//然后初始化桌面
gb.initB();
}
public void initB(){
JFrame jf = new JFrame();//1、新建一个Frame
jf.setTitle("five in a raw");//给这个frame一个名字
jf.setSize(800,600);//设置frame大小
jf.setLocationRelativeTo(null);//这个就是设置窗口位置,要是没有就默认是中间显示
jf.setDefaultCloseOperation(3);//这里就是点关闭就是关闭
//然后就开始设置布局,这里用的是boarder的那种
jf.setLayout(new BorderLayout());
//这种设置方法可以重复使用尺寸,也可以不用下面这种,在每个设置尺寸的地方手动打尺寸
//设置一些固定大小的框框
Dimension d1 = new Dimension(150,250);//设置右边的框框的大小
Dimension d2 = new Dimension(140,40);//设置右边框框内的按键大小
Dimension d3 = new Dimension(500,150);//设置左边大小
//setPreferredSize(d3);//设置棋盘部分
//这里设置大小也可以换成,setSize;setSize是设定的固定大小,而setPreferredSize仅仅是设置最好的大小,
// 这个不一定与实际显示出来的控件大小一致(根据界面整体的变化而变化
this.setSize(500,450);//类要是不extends JPanel就用不了this这种写法
// this.setPreferredSize(d3);
this.setBackground(Color.orange);//设置背景色
jf.add(this,BorderLayout.CENTER);//布局是放在中间
//现在设置右边的界面
JPanel jp =new JPanel();//新建一个Panel
jp.setPreferredSize(d1);//设置大小
jp.setBackground(Color.white);//设置颜色
jf.add(jp,BorderLayout.EAST);//把panel加到之前的那个frame上,并且放在右边
jp.setLayout(new FlowLayout());//顺序排列
//把按钮放在JPanel上
String[] buttonName={"start","undo","give up"};//设置按钮名字
JButton[] button = new JButton[3];//新建按钮对象数组
//设置按钮大小、并放到右侧
for(int i =0;i<buttonName.length;i++){
button[i]=new JButton(buttonName[i]);//分别把每个按钮命名
button[i].setPreferredSize(d2);//设置按钮大小
jp.add(button[i]);//将按钮添加到Panel上
}
//监控按钮
//注意这里直接添加this会提示需要implements BoardDraw项,所以得去类那添加一下
ButtonListener buttonListener = new ButtonListener(this);
for (i=0;i<button.length;i++){
button[i].addActionListener(buttonListener);//这里对每个按键进行了注册
}
//显示图像
jf.setVisible(true);
}
//画棋子
//重写一下paint方法
}
然后我们可以来定义一下画棋子的函数,首先来介绍一下java自带的绘制函数
paint方法的正确用法:
内容目录:
1.使用步骤。
2.原理。
3代码。
1.使用步骤。
1.1新建的.java文件里边的第一个类继承(extends)Jframe(容器)或者JPanel(轻量级容器)。
1.2写一个构造方法,进行初始化窗口(大小、位置、可见、关闭等)。
1.3写一个main方法调用构造方法。
1.4写一个paint方法进行画图,方法前边加@Override。
2.原理。
JFrame、JPanel类都有自己的方法其中有方法,而paint就是他们的方法,而且继承的paint方法在程序运行的时候会自动调用。
不去继承的话,paint方法是自己新写的属于当前类的方法,所以程序运行时并不会自动去调用paint方法,至于怎么去手动调用,暂时还没搞清楚。
所以总结一下就是我不去继承,就画不了东西。当然可能有别的我不知道的办法去手动调用这个方法。(欢迎大家留言纠正我的错误)
3代码。
3.1能画出来东西的代码:
package Test;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Test extends JFrame{
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawRect(50, 50, 100, 100);
}
private void win() {
this.setVisible(true);
this.setSize(500, 500);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Test f = new Test();
f.win();
}
}
3.2不能画出来东西的代码:
package Test;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Test2{
JFrame jf = new JFrame();
public Test2() {
jf.setBounds(500, 250, 500, 500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
g.drawRect(50, 50, 100, 100);
}
public static void main(String[] args) {
new Test2();
}
}
作者:张仁杰_强化班
链接:https://www.jianshu.com/p/d532ba9f9861
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
怎么画这个棋盘区域,下一篇再说