Java–12
第九章 GUI
目录
前言
21世纪,走进了信息时代,各种各样的软件层出不穷,但是总离不开程序开发,离不开程序开发语言,Java语言作为人们所熟知的一门语言,对于其有必要进行系统的学习。
GUI
1.定义
Graphical User Interface,图形用户界面,为用户展现图形化界面;
2.容器
GUI可以看作为一个盒子,内部嵌套进多个组件,用以给用户显示;组件需要加入到容器当中
才可以显示;
2.1JFrame
每个组件都可以理解为一个容器,其中最大的容器为JFrame;
JFrame frame = new JFrame();//实例化JFrame容器
frame.setTitle("GUIDemo");//设置容器标题
frame.setSize(800, 600);//设置容器大小
frame.setLocation(280, 80);//设置容器位置,屏幕左上角为(0,0)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作
frame.setVisible(true);//使窗口显示 此操作放在最后
生成了一个空白的GUI效果
2.2JPanel
JPanel中又可以添加很多其他组件
JPanel panel = new JPanel();//实例化JPanel容器
panel.setSize(800, 600);//设置JPanel容器大小
frame.add(panel);//将JPanel容器加到JFrame容器中
3.组件
3.1 JLabel
标签组件,即显示一个文本
JLabel label= new JLabel();//实例化JLabel组件
label.setText("label");//设置标签显示的文本
panel.add(label);//将文本框加入到JPanel容器中
3.2 JTextFiled
文本框,支持用户输入
JTextField username = new JTextField();//实例化JTextField组件
username.setColumns(20);//设置文本框列大小
3.3 JPasswordField
密码框,用于用户输入密码,会将输入的字符用*隐藏起来
JPasswordField password = new JPasswordField();//实例化JPasswordField组件
password.setColumns(20);//设置密码框列大小
3.4 JButton
按钮组件
JButton login = new JButton();
login.setText("登录");
4.事件监听器
除了组件用于显示外,用户的操作,需要触发一些指定的事件,所以需要使用到事件监听器
去监听并处理用户事件,通过组件.add(监听器)添加事件监听;常用的有ActionListene
r,MouseListener,MouseAdapter,KeyListener,KeyAdapter等
(1)ActionListener
new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
}
}
ActionListener可以监听所有用户的事件;
(2)MouseListener
new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
使用MouseListener事件监听可以监听鼠标事件,需要重写全部六个方法,常用MouseA
dapter代替,其可以按照需要重写一个或多个方法
(3)KeyListener
new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
KeyListener监听键盘事件,可以读取用户点击键盘的一系列操作,需要重写全部的三个
方法,常使用KeyAdapter代替,其可以重写其中一个或多个方法;
5.其它控件
(1)菜单栏
菜单栏提供用户多种分类的操作,丰富了软件的功能,GUI中使用JMenuBar实现菜单栏
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu();
menu.setText("文件");
JMenuItem newFile = new JMenuItem();
newFile.setText("新建");
JMenuItem open = new JMenuItem();
open.setText("打开");
JMenuItem save = new JMenuItem();
save.setText("保存");
JMenuItem exit = new JMenuItem();
exit.setText("退出");
其中整个菜单栏为JMenuBar,包含多个JMenu,而JMenu中又包含多个菜单项JMenuItem
,对于菜单项的事件处理需要使用ActionListener,不可以使用MouseListener
(2)弹窗
用户执行了某些操作,成功或者失败时,需要给用户一些提示信息,方便用户选择下一步进
行什么操作,GUI中使用JOptionPane进行弹窗显示
JOptionPane.showMessageDialog(frame, "保存成功", "提示信息", JOptionPane.INFORMATION_MESSAGE);
其中第一个参数为父控件,第二个参数为显示的信息,第三个参数为弹窗的标题,第四个参
数为弹窗的类型
6.实例
(1)简易用户登录界面实现
public class GUIDemo00 {
public static void loginFrame() {
//实例化容器
JFrame frame = new JFrame();
frame.setTitle("我的GUIDemo");//设置标题
frame.setSize(800, 600);//设置容器大小
frame.setLocation(280, 80);//设置位置 屏幕左上角位置为(0,0)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作
frame.setLayout(new GridLayout(4, 1));//设置布局为4行1列网格布局
JMenuBar menu = new JMenuBar();//实例化菜单栏
JMenu file = new JMenu();//实例化第一个菜单
file.setText("文件");//设置菜单名称
JMenuItem newFile = new JMenuItem();//实例化第一个菜单栏的菜单项
newFile.setText("新建");//设置菜单项名称
JMenu edit = new JMenu();
edit.setText("编辑");
JMenuItem copy = new JMenuItem();
copy.setText("复制");
JPanel first = new JPanel();//设置第一个JPanel容器
JLabel title = new JLabel();
title.setText("登录");
JPanel second = new JPanel();
JLabel userTitle = new JLabel();
userTitle.setText("username");
JTextField username = new JTextField();//实例化文本框
username.setColumns(20);//设置文本框为20列
JPanel third = new JPanel();
JLabel passwordTitle = new JLabel();
passwordTitle.setText("password");
JPasswordField password = new JPasswordField();//实例化密码框
password.setColumns(20);
JPanel fourth = new JPanel();
JButton login = new JButton();//实例化按钮
login.setText("登录");
//给登录按钮添加鼠标事件监听
login.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String u = username.getText();//获取文本框内容
String p = password.getText();//获取密码框内容
System.out.println("username:" + u + " password:" + p);
//弹出提示信息
JOptionPane.showMessageDialog(frame, "登录成功", "提示信息", JOptionPane.INFORMATION_MESSAGE);
}
});
JButton register = new JButton();
register.setText("注册");
register.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//新建窗口
registerFrame();
//设置当前窗口不可见
frame.setVisible(false);
//关闭当前窗口
frame.dispose();
}
});
//添加组件
first.add(title);
second.add(userTitle);
second.add(username);
third.add(passwordTitle);
third.add(password);
fourth.add(login);
fourth.add(register);
frame.add(first);
frame.add(second);
frame.add(third);
frame.add(fourth);
menu.add(file);
menu.add(edit);
file.add(newFile);
edit.add(copy);
//设置文菜单栏
frame.setJMenuBar(menu);
//显示窗口
frame.setVisible(true);
}
public static void registerFrame() {
JFrame frame = new JFrame();
frame.setTitle("我的GUIDemo");
frame.setSize(800, 600);
frame.setLocation(280, 80);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(4, 1));
JMenuBar menu = new JMenuBar();
JMenu file = new JMenu();
file.setText("文件");
JMenuItem newFile = new JMenuItem();
newFile.setText("新建");
JMenu edit = new JMenu();
edit.setText("编辑");
JMenuItem copy = new JMenuItem();
copy.setText("复制");
JPanel first = new JPanel();
JLabel title = new JLabel();
title.setText("注册");
JPanel second = new JPanel();
JLabel userTitle = new JLabel();
userTitle.setText("username");
JTextField username = new JTextField();
username.setColumns(20);
JPanel third = new JPanel();
JLabel passwordTitle = new JLabel();
passwordTitle.setText("password");
JPasswordField password = new JPasswordField();
password.setColumns(20);
JPanel fourth = new JPanel();
JButton login = new JButton();
login.setText("返回");
login.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
loginFrame();
frame.dispose();
}
});
JButton register = new JButton();
register.setText("注册");
register.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String u = username.getText();
String p = password.getText();
System.out.println("username:" + u + " password:" + p);
JOptionPane.showMessageDialog(frame, "注册成功", "提示信息", JOptionPane.INFORMATION_MESSAGE);
}
});
first.add(title);
second.add(userTitle);
second.add(username);
third.add(passwordTitle);
third.add(password);
fourth.add(register);
fourth.add(login);
frame.add(first);
frame.add(second);
frame.add(third);
frame.add(fourth);
menu.add(file);
menu.add(edit);
file.add(newFile);
edit.add(copy);
frame.setJMenuBar(menu);
frame.setVisible(true);
}
public static void main(String[] args) {
loginFrame();
}
}
(2)简易记事本实现
可以进行文件的新建,打开,保存,退出等基础功能
public class GUIDemo01 {
public static void index(File file) {
JFrame frame = new JFrame();
frame.setTitle("我的记事本 "+file.getName().split("\\.")[0]);
frame.setLocation(100, 100);
frame.setResizable(false);
frame.setSize(300, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu();
menu.setText("文件");
JMenuItem newFile = new JMenuItem();
newFile.setText("新建");
JMenuItem open = new JMenuItem();
open.setText("打开");
JMenuItem save = new JMenuItem();
save.setText("保存");
JMenuItem exit = new JMenuItem();
exit.setText("退出");
JPanel panel = new JPanel();
panel.setSize(frame.getSize());
JTextArea textArea = new JTextArea();
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
textArea.setColumns(frame.getWidth()/textArea.getFont().getSize());
textArea.setRows(frame.getHeight()/textArea.getFont().getSize());
try {
if (!file.exists()) {
file.createNewFile();
}
FileReader reader = new FileReader(file);
int i = 0;
int j = 0;
char[] ch = new char[(int) file.length()];
while ((i = reader.read()) != -1) {
ch[j++] = (char) i;
}
textArea.setText(String.valueOf(ch));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setSize(frame.getSize());
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String content = textArea.getText().trim();
try {
FileWriter writer = new FileWriter(file);
writer.write(content);
writer.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
JOptionPane.showMessageDialog(frame, "保存成功", "提示信息", JOptionPane.INFORMATION_MESSAGE);
}
});
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
frame.dispose();
}
});
newFile.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String filename = JOptionPane.showInputDialog("请输入文件名称");
if(filename!=null&&filename.split("\\.").length==1){
filename=filename+".txt";
}
File nF=new File(filename);
if(!nF.exists()){
try {
nF.createNewFile();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
index(nF);
frame.setVisible(false);
frame.dispose();
}
});
open.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String filename = JOptionPane.showInputDialog("请输入文件名称");
if(filename!=null&&filename.split("\\.").length==1){
filename=filename+".txt";
}
File nF=new File(filename);
if(!nF.exists()){
try {
nF.createNewFile();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
index(nF);
frame.setVisible(false);
frame.dispose();
}
});
menu.add(newFile);
menu.add(open);
menu.add(save);
menu.add(exit);
menuBar.add(menu);
panel.add(scrollPane);
frame.setJMenuBar(menuBar);
frame.add(panel);
frame.setVisible(true);
}
public static void main(String[] args) {
String filename = "src/demo12/我的记事本.txt";
index(new File(filename));
}
}
笔记如有错误,遗漏之处,欢迎指正!