GUI
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
Awt与 Swing
java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件
。
常见的布局管理器:
FlowLayout(流式布局管理器)
从左到右的顺序排列。
Panel默认的布局管理器。
BorderLayout(边界布局管理器)
东,南,西,北,中
Frame默认的布局管理器。
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridBagLayout(网格包布局管理器)
非规则的矩阵
简单的窗体创建过程: Frame f = new Frame(“my window”); f.setLayout(new FlowLayout()); //设置布局管理器 f.setSize(500,400); //设置窗体大小 f.setLocation(300,200); //设置窗体出现在屏幕的位置 f.setIconImage(Toolkit.getDefaultToolkit().createImage("qq.png")); Button button = new Button("我是一个按钮"); f.add(button); f.setVisible(true);
事件监听机制
确定事件源(容器或组件)
通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
一般用匿名内部类来表示。
在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
窗口事件关闭窗体
Frame f = new Frame("我的窗体"); //事件源是窗体,把监听器注册到事件源上 //事件对象传递给监听器 f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //退出虚拟机,关闭窗口 System.exit(0); } });
窗口中按钮关闭窗体
Button button = new Button("我是按钮"); //事件源是按钮,给按钮注册监听器 button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } });
鼠标监听器(MouseListener)
void mouseClicked(MouseEvent e)
鼠标按键在组件上单击(按下并释放)时调用。
void mouseEntered(MouseEvent e)
鼠标进入到组件上时调用。
void mouseExited(MouseEvent e)
鼠标离开组件时调用。
void mousePressed(MouseEvent e)
鼠标按键在组件上按下时调用。
void mouseReleased(MouseEvent e)
鼠标按钮在组件上释放时调用。
简单的记事本程序
import java.awt.FileDialog; import java.awt.Font; import java.awt.Frame; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; public class Notepad extends Frame{ //简单的记事本程序 private static final long serialVersionUID = 1L; private MenuItem open; private MenuItem save; private MenuItem quit; private TextArea ta; public Notepad() { init(); menubar(); textArea(); event(); } private void init() { this.setSize(300, 400); //设置窗体大小 this.setLocation(500, 100); //设置窗体的位置 this.setVisible(true); //设置窗体显示 } private void menubar() { MenuBar mb = new MenuBar(); //创建菜单栏 Menu file = new Menu("文件"); //创建菜单 open = new MenuItem("打开"); save = new MenuItem("保存"); quit = new MenuItem("退出"); this.setMenuBar(mb); //将菜单栏添加到窗体上 mb.add(file); //将菜单添加到菜单栏上 file.add(open); //将菜单项添加到菜单上 file.add(save); file.add(quit); } private void textArea() { ta = new TextArea(); ta.setFont(new Font("Courier New", Font.PLAIN, 20)); //设置字体(字体名字,字体样式,字体大小) this.add(ta); //将文本区域添加到窗体上 } private void event() { this.addWindowListener(new WindowAdapter() { //关闭窗体 @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); open.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { open(); } }); save.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { save(); } }); quit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); ta.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { //键盘释放 if(e.getKeyCode() == KeyEvent.VK_O && e.isControlDown()) open(); } }); ta.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_S && e.isControlDown()) save(); } }); } private void open() { FileDialog fd = new FileDialog(this, "打开", FileDialog.LOAD); //创建对话框对象,并指定模式 fd.setVisible(true); //显示对话框 String dir = fd.getDirectory(); //获取对话框的目录 String file = fd.getFile(); //获取对话框的文件名 if(dir != null && file != null){ loadFile(new File(dir,file)); //读取文件 } } private void loadFile(File file) { try ( FileInputStream fis = new FileInputStream(file); //读文件的读取流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); ){ int len; byte[] arr = new byte[1024]; while((len = fis.read(arr))!= -1) { baos.write(arr, 0, len); } byte[] arr2 = baos.toByteArray(); String message = new String(arr2); ta.setText(message); } catch (IOException e) { e.printStackTrace(); } } private void save() { FileDialog fd = new FileDialog(this, "保存", FileDialog.SAVE); fd.setVisible(true); String dir = fd.getDirectory(); String file = fd.getFile(); if(dir != null && file != null) { saveFile(new File(dir,file)); } } private void saveFile(File file) { try( FileWriter fw = new FileWriter(file); //将文本的内容写到指定的文件上 ){ String message = ta.getText(); //获取文本区域中的内容 fw.write(message); //将文本区域的内容写出去 }catch(IOException e) { } } public static void main(String[] args) { new Notepad(); } }