哈工大-软件构造-Lab2-P3相关问题

前言

到了Lab2的P3,感觉自己终于真正地设计一回程序里,之前都是一条一条的命令行,这回终于弄出了还看得过去的图形界面(其实在第二周的时候把命令行模式的游戏打完了,但在同学的怂恿之下,这才开始打有图形界面的程序)。
在这里,命令行模式的东西就不再介绍了,我们已经做的太多了,这里说一下图形界面有关的问题
在此,我只介绍我的实验过程之中接触的方法,并不带表我的方法是唯一或最好的,恰恰相反我的方法还有很多的不足,希望大家批评指正

JFram

首先,我们的界面是要有一个外框的,也就是JFrame

JFrame fr = new JFrame("框的名称");
fr.setLayout(布局,后面会细说);
fr.setLocation(位置的横坐标,位置的纵坐标);
fr.setSize(长度, 宽度);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//这是在退出程序的时候,只需要点击JFrame右上方的叉就可以
fr.setVisible(true);

我们之后的所有的组件都是要基于这个框框的
它的函数:fr.setSize(宽度, 长度)【设置框的大小】、fr.setBackground(Color.颜色)【设置框的背景颜色】等等的函数,大家在网上都可以找到具体的用法

JLabel

其次是标签(JLabel),这相当于一个打印出来的东西(文字或图片),带你出来之后是不能被更改的我们可以用它来向用户展示你想让用户知道的信息

JLabel la = new JLabel("文字内容
"
); fr.add(la)//在JFrame里面加上JLabel

其中要放在所有文字的2段,用来告诉电脑,这些是文本,
是这里用来换行的
如果你想获取文本的内容,可以使用la.getText()函数,更改的话用的是la.setText函数
重点来了,如何在JLabel里添加图片
在国际象棋里面的各种棋子如何打印出来呢,我想到的方法就是打印图片:
首先我么要获取图片,这里用到的是Image(是不是之前没听说过,嗯,我也是第一次用,具体的建议百度查看详细信息)

Image image = null;
image = Toolkit.getDefaultToolkit().getImage("图片的相对路径.png");
//不知道其他的图片格式行不行

在此,推荐一下美图秀秀(我没有找到棋子的素材包,与是用美图秀秀自己抠图抠出来的,自动抠图真的好用)
得到了image,在加上前面的JLabel la,我们就有资本来打印图片了

image = image.getScaledInstance(图片宽度, 图片长度, Image.SCALE_DEFAULT);
ImageIcon img = new ImageIcon();
img.setImage(image);
la.setIcon(img);
la.setBorder(BorderFactory.createLineBorder(Color.black)); //设置边界为黑色
la.setOpaque(true);//如果是打印围棋棋盘的时候,由于要在边上放棋子,就不要加这句了(打棋子的时候要加)
fr.add(la); //添加标签

至于设置大小,位置什么的,和之前是一样的,再次就不多赘述了

JButton

JButton是一个按钮,按下他,你编写的响应事件就会发生,它的定义和上面基本一样的

JButton btn = new JButton("按键的名称");
btn.setBorder(BorderFactory.createLineBorder(Color.black)); 
btn.setSize(按键的长度, 按键的宽度);
btn.setLocation(位置的横坐标, 350);
fr.add(btn);

加了之后怎么写响应事件呢

btn.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent event) {
		所有按键后发生的操作
    }
});

注意,里面不能给在这函数里,但不在这个响应事件里的值赋值
比如:

public class Class{
	int a;
	public static void f(){	
		int b;
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				int c;
				所有按键后发生的操作
		    }
		});
	}
}

这里面a,c是可以赋值的,但b不可以(我也不太清楚为什么),所以b的位置,我是用JLabel来传递信息的:在b的位置,la.setText(“1”), 在c的位置再String s= la.getText()。

JTextField

这是一个文本框,用户可以在里面输入东西,让计算机读入
建立的方法与上边类似

final JTextField text = new JTextField(文本框长度);
text.setBorder(BorderFactory.createLineBorder(Color.black)); 
text.setSize(长度, 宽度);
text.setLocation(位置的横坐标, 位置的纵坐标);
fr.add(text);

读取的时候,text.getText()就可以了
清空的话,就是把文本设置为没有:text.setText("");

JFrame布局

有人说,布局不就是把每个组件都setSize()和setLacation()吗?非也
你不设计布局,JFrame上就什么都没有
首先是系统设计好的,这些布局用起来简便,但是不能灵活地根据需求调整
介绍布局的博客
我就是看了这篇博客在弄明白的,写的很易懂
当设置为fr.setLayout(null)的时候,如果组件不setSize()和setLacation(),他就不会显示

你可能感兴趣的:(哈工大-软件构造-Lab2-P3相关问题)