java的GUI真是方便!Frame f=new Frame();f.setVisible(true);一个窗体就可以看见了。
先说下总结:通过视频学习,总的来说,我觉得写一个GUI程序分为三个部分:1.建造GUI2.注册监听3.实现功能
一、AWT体系:
GUI使用的包是java.awt.*;//awt = Abstract Window Toolkit
这个包也是其他高级GUI工具的基础。基础学习阶段应当掌握好AWT的使用。
体系框架:
GUI中的组件分为2类,容器和非容器。可以向容器中添加组件,但是不能向非容器中添加容器。比如不能向按钮中添加一个Frame。
容器中主要的区别应该是Frame和Dialog,Frame是最初可见的。但是Dialog应当是发生了什么事件才会弹出的对话框。
二、建造GUI
* 制作GUI的步骤:
* 1.建立窗体。
* 2.设置窗体的属性。
* 3.建立组件。
* 4.添加组件
* 5.设置组件的属性
* 6.设置窗体为可见。
这样就可以制作出一个GUI了,但是这样制作出的GUI无法响应用户的动作。比如关闭窗体。
为了能让用户和GUI进行互动,必须给相关的组件添加监听器,当用户发生监听器所监听的行为,则组件会产生相应的事件。
监听器接收到相应的事件后则会有相应的处理,通过这些处理响应用户的动作。
三、事件监听机制:
1.Listener注册在Component上。
2.外部Action触发Component上注册的监听器
3.Component生成对应的Event。
4.Listener捕获到Event。
5.Listener处理Event。
四、窗体的常见布局:
* 1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器
* 2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器。如果窗体中只有一个组件,将会覆盖整个窗体。
* 3)GridLayout:网格式布局管理器,规则的矩阵
* 4)CardLayout:卡片式布局管理器,即选项卡
* 5)GridBayLayout:网格包布局管理器,非规则矩阵
*
* 若存在多种布局方式,为了让这些布局可以共存,应当:
* 1)使用Panel将窗体划分为不同区域,
* 2)然后设置Panel为不同的布局,
* 3)再将相应内容添加到对应的Panel中。
五、文本组件相关
1.TextField和TextArea
TextField单行,功能少,TextArea多行,功能多,可以设置是否能编辑,滚动条。
2.关于键盘输入的keyListener的一些问题:
* 1).keyTyped 与 keyPressed和keyReleased:
* 用keyTyped方法表示键入字符的动作,主要是用于判断输入的字符是什么
* 用keyPressed和keyReleased方法表示键盘操作的动作,主要用于判断按下的按键是什么
* 2).getKeyChar 与getKeyCode和getKeyText
* 这3个方法是根据对应的方法使用的:
* 用keyTyped方法表示键入字符动作,用getKeyChar()来获取键入的字符
* 用keyPressed和keyReleased方法表示键盘动作,用getKeyCode()来获取表示按键的键盘码,用KeyEvent.getKeyText(e.getKeyCode())以获取输入的按键的含义。
* getKeyText可以表示出Ctrl+C:
* public void keyPressed(KeyEvent e)
{
newPrint(KeyEvent.getKeyText(e.getKeyCode())+":"+e.getKeyCode());
if(KeyEvent.VK_ESCAPE==e.getKeyCode())
System.exit(0);
//isControlDown()判断ctrl是否按下,判断组合按键功能
if(e.isControlDown()&&KeyEvent.VK_C==e.getKeyCode())
{
newPrint("ctrl+c");
}
}
需要说明的是:
1.GUI由另一个线程控制。这是非常必要的,如果只有一个线程,那么就会一直卡在GUI界面,不能进行其他操作。
2.GUI传递参数一半第一个是横向相关的,第二个是纵向相关的
3.ActionListener
对于Button ,有ActionListener()和MouseListener(),先响应的是MouseListener()后响应的是ActionListener(),且ActionListener()不光会响应鼠标,也可以响应键盘。按回车也会产生ActionEvent
练习,制作一个窗体程序,这个程序是未完成的,有待后面继续补充:
/**
* 制作一个GUI
* 制作GUI的步骤:
* 1.建立窗体。
* 2.设置窗体的属性。
* 3.建立组件。
* 4.添加组件
* 5.设置组件的属性
* 6.设置窗体为可见。
*
* 这样就可以制作出一个GUI了,但是这样制作出的GUI无法响应用户的动作。比如关闭窗体。
* 为了能让用户和GUI进行互动,必须给相关的组件添加监听器,当用户发生监听器所监听的行为,则组件会产生相应的事件。
* 监听器接收到相应的事件后则会有相应的处理,通过这些处理响应用户的动作。
*
* 窗体的常见布局:
* 1)FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器
* 2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器。如果窗体中只有一个组件,将会覆盖整个窗体。
* 3)GridLayout:网格式布局管理器,规则的矩阵
* 4)CardLayout:卡片式布局管理器,即选项卡
* 5)GridBayLayout:网格包布局管理器,非规则矩阵
*
* 若存在多种布局方式,为了让这些布局可以共存,应当:
* 1)使用Panel将窗体划分为不同区域,
* 2)然后设置Panel为不同的布局,
* 3)再将相应内容添加到对应的Panel中。
*
* TextField单行,功能少,TextArea多行,功能多,可以设置是否能编辑,滚动条。
*
* 关于键盘输入的keyListener的一些问题:
* 1.keyTyped 与 keyPressed和keyReleased:
* 用keyTyped方法表示键入字符的动作,主要是用于判断输入的字符是什么
* 用keyPressed和keyReleased方法表示键盘操作的动作,主要用于判断按下的按键是什么
* 2.getKeyChar 与getKeyCode和getKeyText
* 这3个方法是根据对应的方法使用的:
* 用keyTyped方法表示键入字符动作,用getKeyChar()来获取键入的字符
* 用keyPressed和keyReleased方法表示键盘动作,用getKeyCode()来获取表示按键的键盘码,用KeyEvent.getKeyText(e.getKeyCode())以获取输入的按键的含义。
* getKeyText可以表示出Ctrl+C
*
* public void keyPressed(KeyEvent e)
{
newPrint(KeyEvent.getKeyText(e.getKeyCode())+":"+e.getKeyCode());
if(KeyEvent.VK_ESCAPE==e.getKeyCode())
System.exit(0);
//isControlDown()判断ctrl是否按下,判断组合按键功能
if(e.isControlDown()&&KeyEvent.VK_C==e.getKeyCode())
{
newPrint("ctrl+c");
}
}
*
* 关于ActionListener
* 对于Button ,有ActionListener()和MouseListener(),先响应的是MouseListener()后响应的是ActionListener(),且ActionListener()不光会响应鼠标,也可以响应键盘。按回车也会产生ActionEvent
*
*
* */
package test;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class CardEvaluatorGUI {
Frame fBase;
Label lblGameName;
TextField tfSearch;
Button btnSearch;
Button btnReset;
Button btnUpdate;
Label lblAPPID;
TextField tfID;
Button btnAdd;
Button btnResult;
TextArea taInfo;
Label lblResult;
//搜索的关键字,由tfSearch获取。
String keyWords;
//保存游戏的集合。
HashSet<Card> bundleContent;
String tmpAppid;
CardEvaluatorGUI() {
InitGUI();
bundleContent=new HashSet<Card>();
}
private void InitGUI() {
// 通过Toolkit.getDefaultToolkit().getScreenSize()的width和height字段,可以获取屏幕的宽和高,也就是分辨率。
int screenWidth = (int) Toolkit.getDefaultToolkit().getScreenSize().width;
int screenHeight = (int) Toolkit.getDefaultToolkit().getScreenSize().height;
// 新建一个窗体,参数为窗体上的标题名
fBase = new Frame("Card Evaluator");
// setBounds(x,y,w,h)可以设置窗体在屏幕上的位置和大小。
fBase.setBounds(screenWidth / 4, screenHeight / 4, screenWidth / 2,
screenHeight / 2);
// setLayout()设置窗体的布局。
// 为了让组件到大概的位置,我使用了空布局,手动给组件定位。
fBase.setLayout(null);
{
// Label是标签。新建一个标签可以在参数中写入标签内容,还可以通过Label的字段设置标签文字的对齐方式,这里我用Label.RIGHT设置成右对齐。
lblGameName = new Label("游戏名:", Label.RIGHT);
// TextField允许编辑单行文本的文本组件。
tfSearch = new TextField();
// Button按钮
btnSearch = new Button("查询");
btnReset = new Button("重置/清空");
btnUpdate = new Button("更新数据");
lblAPPID = new Label("APPID:", Label.RIGHT);
tfID = new TextField();
btnAdd = new Button("添加");
btnResult = new Button("评估价值");
// TextArea 显示文本的多行区域
taInfo = new TextArea();
// 设置文本区域不可编辑,只能读取。
taInfo.setEditable(false);
lblResult = new Label("分析结果:");
regLinstener();
// 将组件添加到窗体上。
fBase.add(lblGameName);
fBase.add(tfSearch);
fBase.add(btnSearch);
fBase.add(btnReset);
fBase.add(btnUpdate);
fBase.add(lblAPPID);
fBase.add(tfID);
fBase.add(btnAdd);
fBase.add(btnResult);
fBase.add(taInfo);
fBase.add(lblResult);
// 设置组件在窗体上的位置x,y,w,h
lblGameName.setBounds(0, screenHeight / 20, screenWidth / 10,
screenHeight / 20);
tfSearch.setBounds(screenWidth / 10, screenHeight / 20,
screenWidth / 10, screenHeight / 20);
btnSearch.setBounds(screenWidth / 10 * 2, screenHeight / 20,
screenWidth / 10, screenHeight / 20);
btnReset.setBounds(screenWidth / 10 * 3, screenHeight / 20,
screenWidth / 10, screenHeight / 20);
btnUpdate.setBounds(screenWidth / 10 * 4, screenHeight / 20,
screenWidth / 10, screenHeight / 20);
lblAPPID.setBounds(0, screenHeight / 20 * 2, screenWidth / 10,
screenHeight / 20);
tfID.setBounds(screenWidth / 10, screenHeight / 20 * 2,
screenWidth / 10, screenHeight / 20);
btnAdd.setBounds(screenWidth / 10 * 2, screenHeight / 20 * 2,
screenWidth / 10, screenHeight / 20);
btnResult.setBounds(screenWidth / 10 * 3, screenHeight / 20 * 2,
screenWidth / 10 * 2, screenHeight / 20);
taInfo.setBounds(screenWidth / 2 / 80, screenHeight / 20 * 3,
screenWidth / 2 * 39 / 40, screenHeight / 20 * 6);
lblResult.setBounds(screenWidth / 2 / 80, screenHeight / 20 * 9,
screenWidth / 2 * 39 / 40, screenHeight / 20);
}
fBase.setVisible(true);
}
private void regLinstener() {
/*
* 窗体增加一个关闭的监听器。
* 向某个组件添加监听器一般是调用组件对象的addXXXListener方法,需要一个监听器对象作为参数,
* 一般都是与方法对应的XXXListener接口,但是为了方便使用都会派生出一个适配器子类XXXAdapter。
*/
fBase.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//TextField增加一个按键监听器。如果按下回车相当于点了“查询”
tfSearch.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e) {
if(KeyEvent.VK_ENTER==e.getKeyCode())
{
keyWords=tfSearch.getText();//获取TextField中的文本。
searchGameDialog();
tfSearch.setText("");
}
}
});
//按钮增加一个动作监听器。对于Button ,有ActionListener()和MouseListener(),先响应的是MouseListener()后响应的是ActionListener(),且ActionListener()不光会响应鼠标,也可以响应键盘。按回车也会产生ActionEvent
btnSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
keyWords=tfSearch.getText();
searchGameDialog();
tfSearch.setText("");
}
});
//重置按钮 清空所有保存的内容,同时清空文本区所有内容。
btnReset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
bundleContent.clear();
keyWords="";
tfSearch.setText("");
taInfo.setText("");
}
});
//更新按钮 更新本地卡片“数据库”。
btnUpdate.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateDB();
}
});
//输入游戏APPID,如果按下回车相当于点击了添加
tfID.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e)
{
if(KeyEvent.VK_ENTER==e.getKeyCode())
{
tmpAppid=tfID.getText();
getAppid(tmpAppid);
tfID.setText("");
}
}
});
//以APPID方式添加游戏
btnAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tmpAppid=tfID.getText();
getAppid(tmpAppid);
tfID.setText("");
}
});
//列出统计结果
btnResult.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showCountInfo();
}
});
}
private void searchGameDialog() {
// TODO 自动生成的方法存根
}
//更新本地卡片“数据库”。
private void updateDB() {
// TODO 自动生成的方法存根
}
//添加所查游戏
private void addGame(int tmpid) {
// TODO 自动生成的方法存根
}
//用APPID添加游戏
private int getAppid(String text) {
// TODO 自动生成的方法存根
/* int tmpid=-1;
if(-1!=(tmpid=getAppid(tfID.getText()))){
addGame(tmpid);
}*/
return 0;
}
private void showCountInfo() {
// TODO 自动生成的方法存根
}
public static void main(String[] args) {
new CardEvaluatorGUI();
}
}