------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!

-------

GUI(图形用户界面)

Java为GUI提供对象都存在java.Awt和javax.Swing包中

java.Awt:Abstract

Window

ToolKit(抽象窗口工具包),需要调用本地系统方

法实现功能,较为依赖平台。

javax.Swing:在Awt基础上建立的一套图形界面系统,其中提供了更多的组件,

且完全由Java实现,增强了移植性。

容器中的组件排放方式:布局

布局管理器:流式布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)、网格包布局(GridBagLayout)、卡片布局(CardLayout)

创建图形化界面:创建前需导入awt包及awt.event包

创立窗体:Frame f=new Frame("my

awt");

设置大小: f.setSize(600,400);

设置位置:f.setLocation(300, 200);

//以上可简化为设置边界:前面为位置,后面为窗体大小

f.setBounds(300,200,600,400);

设置为可见: f.setVisible(true);

设置布局:

f.setLayout(new

FlowLayout);//设置为流式布局

添加按钮:Button

b=new

Button();

f.add(b);

创建图形化界面(5步):

1、创建Frame窗体;

2、对窗体进行基本设置:比如大小、位置、布局;

3、定义组件;

4、将组件通过窗体的add方法添加到窗体中;

5、让窗体显示:通过setVisible(true);

事件监听机制组成:

事件处理机制专门用于响应用户的操作,比如响应用户点击鼠标、按下键盘等操作,及对此操作多采取的处理方式。GUI中事件处理机制又称作事件监听机制,由事件源、事件、监听器及事件处理所构成。其中:

事件源:就是awt包或者swing包中那些图形界面组件;

事件(Event):由外部动作引发,每一个事件源都有自己特有的对应事件和共性事件;

监听器(Listener):将可以触发某一事件的动作(不止一个动作)都已经封装到了监听器中。

以上三者在java中都已经定义好了,只需获取其对象来用就可以了。我们要做的事情是,对产生的动作进行处理。

我们如果要实现事件监听,要么实现事件的Listener接口或者继承其适配器类实现一个事件监听类,并对处理监听动作的方法进行重写;要么调用add...Listener方法,使用适配器内部类为事件源注册监听器对象,再对处理监听动作的方法进行重写。例如实现Frame窗体关闭事件,两者示例如下:

一、窗体对象使用addWindowListener()方法调用MyWindowListener对象即可构成监听机制:

class MyWindowListener
extends
WindowAdapter{
public void windowClosing(WindowEvent
e){
Window w=(Window)e.getComponent();
w.dispose();
}
}
MyWindowListener mwl=new MyWindowListener();
f.addWindowListener(mwl);

二、窗体对象直接添加适配器内部类对象:

f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

当建立好了Frame窗体时,我们通过点击窗体右上角关闭按钮并不能正常退出,这是因为awt中动作的实现都需要定义功能来完成,因此我们如果想关闭窗口,需要通过事件处理机制对窗口进行监听。

让按钮具备退出程序功能:关闭按钮就是事件源

那么选择那个监听器呢?

通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器,需要查看该组对象的功能。

通过查阅button的描述,发现按钮支持一个特有监听addActionListener,该监听无Adapter适配器(适配器即本身):

button.addActionListener(new
ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
});

或者通过添加窗口监听:

button.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
d.setVisible(false);//将窗体设置为不见,也为关闭
}
});

其他监听方式:

一、按钮在被鼠标进入和点击时显示输出(鼠标监听):

button.addMouseListener(new MouseAdapter(){
private int
count=1;
private int
clickCount=1;
public void
mouseEntered(MouseEvent e)
{ //鼠标进入按钮区域时输出
System.out.println("鼠标进入该组件"+count++);
}
public void
mouseClicked(MouseEvent
e){ //鼠标点击两次时输出
if(e.getClickCount()==2)
System.out.println("双击动作"+clickCount++);
}
}

二、键盘输入数据进行相应操作(键盘监听):

button.addKeyListener(new
KeyAdapter(){
public void
keyPressed(KeyEvent e){
System.out.println(e.getKeyChar()+"...."+e.getKeyCode());
System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER)//触发Ctrl+Enter键后按钮确认退出
System.exit(0);
}
});

在我们登陆QQ时,如果密码填写错误,往往会弹出一个对话框,显示”您的密码输入错误”的信息。由此,我们也可以在我们的窗体中添加对话框,确认进行的操作是否正确的的判断,错误则弹出对话框”您的输入有误”。

添加对话框:

//建立对话框,为窗体f所持有,框名为”错误提示窗”,模态为:true
Dialog
d=new Dialog(f,"错误提示窗",true);
//对对话框进行基本设置:
d.setSize(280, 160);
d.setLocation(300, 200);
d.setLayout(new FlowLayout());
//设置标签:
Lable lab=new
Label();
lab.setText("
您的输入有误");
b1=new Button("确定");
//在按钮上添加键盘监听
b1.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER){//点击回车则退出
d.setVisible(false);
}
}
});
//对话框添加组件:
d.add(lab);
d.add(b1);

添加菜单(下拉式菜单和弹出式菜单):

下拉式菜单:包含三个组件:MeneBar(菜单栏)、Menu(菜单栏)、MenuItem(菜单项)

注:菜单的组件都是在窗体上的,因此要新建菜单之前要建窗体。

//建立菜单栏:
MenuBar bar=new MenuBar();
//建立菜单,命名为”文件”
Menu fileMenu=new
Menu("文件");
//建立子菜单,并设置选项名
MenuItem openItem=new
MenuItem("打开");
MenuItem saveItem=new
MenuItem("保存");
MenuItem closeItem=new
MenuItem("退出");
bar.add(fileMenu); //将菜单添加到菜单栏
//将子菜单添加到菜单
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
//将菜单栏添加到窗体:
f.setMenuBar(bar);
//将菜单信息与系统文件关联:
FileDialog openDia=new
FileDialog(f,"我要打开",FileDialog.LOAD);
FileDialog saveDia=new
FileDialog(f,"我要保存",FileDialog.SAVE);

相对于AWT来说,Swing包中提供了更加丰富、便捷、强大的GUI组件,而且这些组件都是Java语言编写而成的,因此,Swing组件不依赖于本地平台(可以跨平台)。下面通过一个程序进行详细讲解:需要先导入三个包:awt包、awt.event包及swing包

需求:创建一个聊天对话框,在文本域输入数据后点击发送,即可显示发送的信息到文本显示框中:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class TextDemo extends
JFrame{//窗体继承JFrame
//先建立所需组件,进行默认初始化
JButton sendBT;//建立按钮
JTextField inputField;//建立文本框
JTextArea chatContent;//建立文本域
public TextDemo(){
//将窗体设置为边界布局
this.setLayout(new BorderLayout());
//设置文本域大小
chatContent=new JTextArea(12,34);
//创建一个滚动面板
JScrollPane showPanel=new
JScrollPane(chatContent);
//将文本域设置为不可编辑
chatContent.setEditable(false);
//创建一个Panel面板并设置面板大小
JPanel inputPanel=new JPanel();
inputField=new JTextField(20);
//设置按钮
sendBT=new JButton("发送");
//添加活动监听
sendBT.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String content=inputField.getText();
if(content!=null&&!content.trim().equals("")){
chatContent.append("本人:"+content+"\n");
}else{
chatContent.append("聊天信息不能为空"+"\n");
}
//将文本设置为空
inputField.setText("");
}
});
//创建标签:
Label label=new Label("聊天信息");
//添加组件
inputPanel.add(label);
inputPanel.add(inputField);
inputPanel.add(sendBT);
this.add(showPanel,BorderLayout.CENTER);
this.add(inputPanel, BorderLayout.SOUTH);
//进行窗体基本设置:
this.setTitle("聊天窗口");
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new TextDemo();
}
}