javaGUI
1.GUI的概念
GUI(Graphical User Interface)即图形用户界面,它能够使应用程序看上去更加友好。
2.Swing概述
1.Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同的外观和相同的行为;
2.Swing中的大部分组件类位于javax.swing包中。
3.容器组件
Java的图形用户界面的基本组成部分是组件,组件是以一个图形化的方式显示在屏幕上并能与用户进行交互的对象;
组件不能独立地显示出来,必须将组件放在一定的容器组件(container)中才可以显示出来。容器组件可以容纳多个组件,通过调用容器组件的add(Component comp)方法向容器中添加组件。
1.常用容器组件
(1)窗口(Frame)
JFrame用于在Swing程序中创建窗体;
JFrame类的构造方法
JFrame();创建窗体,该窗体初始为不可见;
JFrame(String title);创建窗体,使用参数title指定标题,该窗体初始为不可见。
(2)面板(Panel)
JPanel提供面板,它是轻量级的容器;
面板中可以添加其他组件,也可以设置布局,我们一般使用面板来实现布局嵌套。
2.布局管理器
Java中的图形界面在布局管理上采用容器和布局管理器相分离的方案,也就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要用到布局管理器(Container)。Java中有几种常用的布局管理器,分别是:FlowLayout(流式布局)、BorderLayout(边界布局)、GridLayout(网格布局)。
(1)FlowLayout
FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,并在默认情况下使组件尽量居中放置。对组件逐行定位,行内从左到右,一行排满后换行。不改变组件的大小,按组件原有尺寸显示组件,可设置不同组件间距、行距以及对齐方式。
构造方法:
FlowLayout(FlowLayout.RIGHT,20,40);右对齐,组件之间水平间距20个像素,垂直间距40个像素。
FlowLayout(FlowLayout.LEFT);左对齐,水平和垂直间距为缺省值(5)。
FlowLayout();使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)。
(2)BorderLayout
BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是由BorderLayout类中的North、South、East、West和Center5个常量来确定的,他们对应着容器中的上下左右中。组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一点,而且可以只用其中几个区域。
(3)GridLayout
GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的大小和创建网格的多少来确定的。在构造方法中指定分割的行数和列数。
import javax.swing.*;
import java.awt.*;
//我们自己的类继承JFrame
public class FrameDemo extends JFrame {
public void createFrame(){
//设置窗口特征
this.setSize(300,300);
this.setTitle("GUI窗口");//窗口标题
this.setIconImage(new ImageIcon("1.1.jpg").getImage());//设置图标
//this.setLocation(300,300);//设置坐标
this.setLocationRelativeTo(null);//默认在中间
//this.setResizable(false);//不能改变窗口大小
//this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不能关闭窗口
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口,退出程序
/*Container container = this.getContentPane();//默认面板使用的是边界布局
container.setBackground(Color.BLUE);
JButton jb = new JButton("按钮");*/
//container.add(jb);
//自己创建一个面板
//JPanel jp = new JPanel();//默认是流式布局
JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT,10,10));//设置为流式布局 从左到右
//JPanel jp = new JPanel(new BorderLayout());//边界布局
//JPanel jp = new JPanel(new GridLayout());//网格布局
jp.setBackground(Color.green);
JButton jb1 = new JButton("按钮");
JButton jb2 = new JButton("按钮");
JButton jb3 = new JButton("按钮");
JButton jb4 = new JButton("按钮");
JButton jb5 = new JButton("按钮");
jp.add(jb1);
jp.add(jb2);
jp.add(jb3);
jp.add(jb4);
jp.add(jb5);
this.add(jp);
dispose();//释放窗口
this.setVisible(true);//窗体可视化
}
public static void main(String[] args){
new FrameDemo().createFrame();//创建一个窗口
}
}
//我们自己的类继承JFrame
public class FrameDemo2 extends JFrame {
public void createFrame(){
//设置窗口特征
this.setSize(300,300);
this.setTitle("GUI窗口");//窗口标题
this.setIconImage(new ImageIcon("1.1.jpg").getImage());//设置图标
//this.setLocation(300,300);//设置坐标
this.setLocationRelativeTo(null);//默认在中间
//this.setResizable(false);//不能改变窗口大小
//this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不能关闭窗口
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口,退出程序
/*Container container = this.getContentPane();//默认面板使用的是边界布局
container.setBackground(Color.BLUE);
JButton jb = new JButton("按钮");*/
//container.add(jb);
//自己创建一个面板
//JPanel jp = new JPanel();//默认是流式布局
//JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT,10,10));//设置为流式布局 从左到右
//边界布局默认有5个区域,上,下,左,右,中间 每个区域组件会自动最大化,中间是必须的,上下左右可以不存在,中间区域会覆盖
JPanel jp = new JPanel(new BorderLayout());//边界布局
//JPanel jp = new JPanel(new GridLayout());//网格布局
jp.setBackground(Color.green);
JButton jb1 = new JButton("按钮1");
JButton jb2 = new JButton("按钮2");
JButton jb3 = new JButton("按钮3");
JButton jb4 = new JButton("按钮4");
JButton jb5 = new JButton("按钮5");
jp.add(jb1,BorderLayout.NORTH);
jp.add(jb2,BorderLayout.EAST);
jp.add(jb3,BorderLayout.SOUTH);
jp.add(jb4,BorderLayout.WEST);
jp.add(jb5,BorderLayout.CENTER);
this.add(jp);
dispose();//释放窗口
this.setVisible(true);//窗体可视化
}
public static void main(String[] args){
new FrameDemo2().createFrame();//创建一个窗口
}
}
//我们自己的类继承JFrame
public class FrameDemo3 extends JFrame {
public void createFrame(){
//设置窗口特征
this.setSize(300,300);
this.setTitle("GUI窗口");//窗口标题
this.setIconImage(new ImageIcon("1.1.jpg").getImage());//设置图标
//this.setLocation(300,300);//设置坐标
this.setLocationRelativeTo(null);//默认在中间
//this.setResizable(false);//不能改变窗口大小
//this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不能关闭窗口
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口,退出程序
/*Container container = this.getContentPane();//默认面板使用的是边界布局
container.setBackground(Color.BLUE);
JButton jb = new JButton("按钮");*/
//container.add(jb);
//自己创建一个面板
//JPanel jp = new JPanel();//默认是流式布局
//JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT,10,10));//设置为流式布局 从左到右
//边界布局默认有5个区域,上,下,左,右,中间 每个区域组件会自动最大化,中间是必须的,上下左右可以不存在,中间区域会覆盖
//JPanel jp = new JPanel(new BorderLayout());//边界布局
//网格布局 定义行数,列数,从第一行第一列开始摆放,当第一行占满了,从第二行开始,当网格占满后,继续向里面添加,会重新开辟一列
JPanel jp = new JPanel(new GridLayout(2,2));//网格布局
jp.setBackground(Color.green);
JButton jb1 = new JButton("按钮1");
JButton jb2 = new JButton("按钮2");
JButton jb3 = new JButton("按钮3");
JButton jb4 = new JButton("按钮4");
JButton jb5 = new JButton("按钮5");
jp.add(jb1);
jp.add(jb2);
jp.add(jb3);
jp.add(jb4);
jp.add(jb5);
this.add(jp);
dispose();//释放窗口
this.setVisible(true);//窗体可视化
}
public static void main(String[] args){
new FrameDemo3().createFrame();//创建一个窗口
}
}
//我们自己的类继承JFrame
public class FrameDemo4 extends JFrame {
public void createFrame(){
//设置窗口特征
this.setSize(300,300);
this.setTitle("GUI窗口");//窗口标题
this.setIconImage(new ImageIcon("1.1.jpg").getImage());//设置图标
//this.setLocation(300,300);//设置坐标
this.setLocationRelativeTo(null);//默认在中间
//this.setResizable(false);//不能改变窗口大小
//this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不能关闭窗口
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口,退出程序
/*Container container = this.getContentPane();//默认面板使用的是边界布局
container.setBackground(Color.BLUE);
JButton jb = new JButton("按钮");*/
//container.add(jb);
//自己创建一个面板
//JPanel jp = new JPanel();//默认是流式布局
//JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT,10,10));//设置为流式布局 从左到右
//边界布局默认有5个区域,上,下,左,右,中间 每个区域组件会自动最大化,中间是必须的,上下左右可以不存在,中间区域会覆盖
//JPanel jp = new JPanel(new BorderLayout());//边界布局
//JPanel jp = new JPanel(new GridLayout());//网格布局
JPanel jp = new JPanel(null);//布局管理器 使用定位
jp.setBackground(Color.green);
JButton jb1 = new JButton("按钮1");
jb1.setSize(200,100);
jb1.setLocation(20,20);
jp.add(jb1);
this.add(jp);
dispose();//释放窗口
this.setVisible(true);//窗体可视化
}
public static void main(String[] args){
new FrameDemo4().createFrame();//创建一个窗口
}
}
4.常用组件
1.标签组件(JLabel)
标签是容纳文本和图标的控件,通常用来在界面中识别别的控件。
(1)构造函数:
JLabel()创建一个空的标签;
JLabel(String text)创建一个带文本的标签;
JLabel(Icon image)创建一个带图像的标签。
2.单行文本组件(JTextField)
构造函数:
JTextField() 创建一个空的文本框 ;
JTextField(String text ) 创建一个带文字的文本框;
JTextField(int columns) 创建一个设置列数的空文本框;
JTextField(String text, int columns) 创建一个设置列数的带文字的文本框。
3.多行文本框组件(JTextArea)
构造函数:
JTextArea() 创建一个空的文本域;JTextArea(String text) 用指定文本初始化文本域;
JTextArea(int rows, int columns) 创建一个指定行数和列数的空文本域;
JTextArea(String text,int rows, int columns) 创建一个带文本,并指行数和列数的;
package com.ff.javagui.day2;
import javax.swing.*;
public class FrameDemo2 extends JFrame{
public void creatFrame(){
this.setSize(400,400);
this.setTitle("登录窗口");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
JPanel jp = new JPanel();
//多行文本
JTextArea jta = new JTextArea(5,25);
JScrollPane jsp = new JScrollPane(jta);//可以自动添加滚动条
jta.setLineWrap(true);//强制换行
jta.setWrapStyleWord(true);//英文不换行
jp.add(jsp);
//jp.add(jta);
JButton jb = new JButton("发送");
jp.add(jb);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args) {
new FrameDemo2().creatFrame();
}
}
4.密码框组件(JPasswordField)
构造函数:
JPasswordField()创建一个空密码框;
JPasswordField(String text)创建一个有密码字符串的密码框;
JPasswordField(String text, int columns)创建一个有密码字符串且设置了列数的密码框;
package com.ff.javagui.day2;
import javax.swing.*;
import java.awt.*;
public class FrameDemo1 extends JFrame {
public void creatFrame(){
this.setSize(400,400);
this.setTitle("登录窗口");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
JPanel jp = new JPanel();
//标签组件
JLabel jl = new JLabel("账号");
//jl.setFont(new Font("隶书",Font.BOLD,20));
// System.out.println(jl.getText());//获得内容
jp.add(jl);
//单行文本组件
JTextField jt = new JTextField("账号",25);//columns:列数
//jt.setEditable(false);//禁止编辑
jt.setToolTipText("请输入账号");//提示文字
jp.add(jt);
//密码框
JLabel jll = new JLabel("密码");
jp.add(jll);
JPasswordField jpf = new JPasswordField("123123",25);
//System.out.println(jpf.getText());
//System.out.println(new String(jpf.getPassword()));
jp.add(jpf);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args) {
new FrameDemo1().creatFrame();
}
}
5.菜单栏组件
构造方法:
JMenuBar()
6.菜单组件
构造方法:
JMnue(“菜单名称”)
7.菜单项组件
构造方法:
JMnueItem(“菜单项名称”)
package com.ff.javagui.day2;
import javax.swing.*;
public class FrameDemo3 extends JFrame {
public void creatFrame(){
this.setSize(400,400);
this.setTitle("登录窗口");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
JPanel jp = new JPanel();
//菜单栏
JMenuBar jmb = new JMenuBar();
//菜单
JMenu jm1 = new JMenu("文件");
JMenu jm2 = new JMenu("编辑");
JMenu jm3 = new JMenu("帮助");
//菜单项
JMenuItem jmi1 = new JMenuItem("新建");
JMenuItem jmi2 = new JMenuItem("保存");
JMenuItem jmi3 = new JMenuItem("另存为");
JMenuItem jmi4 = new JMenuItem("设置");
JMenuItem jmi5 = new JMenuItem("关于我们");
jm1.add(jmi1);
jm1.add(jmi2);
jm1.add(jmi3);
jm2.add(jmi4);
jm3.add(jmi5);
jmb.add(jm1);
jmb.add(jm2);
jmb.add(jm3);
jp.add(jmb);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args) {
new FrameDemo3().creatFrame();
}
}
5.事件处理
- 一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单的等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件。一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。
2.添加事件监听
対象.addActionListener(new ActionListener(){
//事件处理
@Override
public void actionPerformed(ActionEvent e){执行操作}});
package com.ff.javagui.day2;
import javax.swing.*;
import java.awt.event.ActionEvent;
//事件处理
public class FrameDemo4 extends JFrame {
public void creatFrame(){
this.setSize(400,400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("事件处理");
JPanel jp = new JPanel();
JMenuBar jm = new JMenuBar();
JMenu jm1 = new JMenu("文件");
JMenu jm2 = new JMenu("编辑");
JMenu jm3 = new JMenu("帮助");
JMenuItem ji1 = new JMenuItem("打开");
JMenuItem ji2 = new JMenuItem("保存");
JMenuItem ji3 = new JMenuItem("另存为");
JMenuItem ji4 = new JMenuItem("设置");
JMenuItem ji5 = new JMenuItem("关于我们");
//监听器,给菜单项添加监听器
ji5.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我们什么都没有,略略略");
}
});
jm1.add(ji1);
jm1.add(ji2);
jm1.add(ji3);
jm2.add(ji4);
jm3.add(ji5);
jm.add(jm1);
jm.add(jm2);
jm.add(jm3);
jp.add(jm);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args) {
new FrameDemo4().creatFrame();
}
}
登录页面
package com.ff.javagui.work2;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class Log extends JFrame {
public void creatFrame(){
this.setSize(400,400);
this.setTitle("登录界面");
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jp = new JPanel(null);
//账号标签
JLabel jl1 = new JLabel("账号:");
jl1.setSize(70,50);
jl1.setLocation(50,70);
//账号文本框
JTextField jt1 = new JTextField(20);
jt1.setSize(200,40);
jt1.setLocation(150,70);
jt1.setToolTipText("请输入账号");
//密码标签
JLabel jl2 = new JLabel("密码:");
jl2.setSize(70,50);
jl2.setLocation(50,170);
//密码框
JPasswordField jt2 = new JPasswordField(20);
jt2.setSize(200,40);
jt2.setLocation(150,170);
jt2.setToolTipText("请输入密码");
//登录按钮
JButton jb = new JButton("登录");
jb.setSize(100,50);
jb.setLocation(150,260);
//给按钮添加监听器
jb.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(jt1.getText().length() == 0){
JOptionPane.showMessageDialog(null,"账号不能为空","警告",JOptionPane.ERROR_MESSAGE);
}else {
System.out.println("账号:"+jt1.getText());
System.out.println("密码:"+new String(jt2.getPassword()));
new Chat().creatFrame();
}
}
});
jp.add(jl1);
jp.add(jt1);
jp.add(jl2);
jp.add(jt2);
jp.add(jb);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args) {
new Log().creatFrame();
}
}
聊天框
package com.ff.javagui.work2;
import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Chat extends JFrame {
public void creatFrame(){
this.setSize(600,600);
this.setTitle("聊天窗口");
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setLocationRelativeTo(null);
JPanel jp = new JPanel(null);
//多行文本
JTextArea jta = new JTextArea();
jta.setLineWrap(true);
jta.setWrapStyleWord(true);
jta.setFont(new Font("隶书",Font.BOLD,20));
JScrollPane jsp = new JScrollPane(jta);
jsp.setSize(550,450);
jsp.setLocation(20,20);
//单行文本
JTextField jt = new JTextField();
jt.setSize(430,50);
jt.setLocation(20,480);
jt.setFont(new Font("隶书",Font.BOLD,20));
//按钮
JButton jb = new JButton("发送");
jb.setSize(105,50);
jb.setLocation(460,480);
//给按钮添加监听器
jb.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
jta.append(jt.getText()+"\n");
jt.setText("");
}
});
//给关闭窗口添加监听
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
JOptionPane.showConfirmDialog(null,"确定要关闭吗?","操作提示",JOptionPane.YES_NO_CANCEL_OPTION);
}
});
jp.add(jsp);
jp.add(jt);
jp.add(jb);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args){
new Chat().creatFrame();
}
}
记事本
package com.ff.javagui.work2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class Save extends JFrame {
public void creatFrame(){
this.setSize(400,400);
this.setLocationRelativeTo(null);
this.setTitle("菜单");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel jp = new JPanel(null);
//菜单栏
JMenuBar jmb = new JMenuBar();
jmb.setSize(400,30);
jmb.setLocation(0,0);
//菜单
JMenu jm1 = new JMenu("文件");
jm1.setSize(40,30);
jm1.setLocation(0,0);
JMenu jm2 = new JMenu("编辑");
jm2.setSize(40,30);
jm2.setLocation(40,0);
JMenu jm3 = new JMenu("帮助");
jm3.setSize(40,30);
jm3.setLocation(80,0);
//菜单项
JMenuItem ji1 = new JMenuItem("打开");
JMenuItem ji2 = new JMenuItem("保存");
JMenuItem ji3 = new JMenuItem("设置");
JMenuItem ji4 = new JMenuItem("关于我们");
//多行文本框
JTextArea jta = new JTextArea();
jta.setLineWrap(true);
jta.setWrapStyleWord(true);
jta.setFont(new Font("隶书",Font.BOLD,20));
JScrollPane jsp = new JScrollPane(jta);
jsp.setSize(382,330);
jsp.setLocation(0,30);
//给菜单添加监听事件
ji2.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
PrintWriter out = new PrintWriter("H:\\c.txt");
out.println(jta.getText());
out.flush();
out.close();
} catch (FileNotFoundException fileNotFoundException) {
fileNotFoundException.printStackTrace();
}
}
});
ji4.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
new Save().creatFrame1();
}
});
jm1.add(ji1);
jm1.add(ji2);
jm2.add(ji3);
jm3.add(ji4);
jmb.add(jm1);
jmb.add(jm2);
jmb.add(jm3);
jp.add(jmb);
jp.add(jsp);
this.add(jp);
this.setVisible(true);
}
public void creatFrame1(){
this.setSize(250,90);
this.setLocationRelativeTo(null);
JPanel jp = new JPanel();
JLabel jl = new JLabel("这里什么都没有,我啥啥都不会");
jp.add(jl);
this.add(jp);
this.setVisible(true);
}
public static void main(String[] args){
new Save().creatFrame();
}
}
6.对话框
JOptionPane对话框 showMessageDialog():消息对话框
主要有五种消息类型,类型不同,图标不同: ERROR_MESSAGE 错误消息提示 INFORMATION_MESSAGE 信息提示 WARNING_MESSAGE警告提示 QUESTION_MESSAGE 问题提示
PLAIN_MESSAGE 简洁提示showConfirmDialog():确认对话框
主要有四种消息类型,类型不同,图标不同:
DEFAULT_OPTION 默认选项 YES_NO_OPTION 是/否选项
YES_NO_CANCEL_OPTION 是/否/取消选项
OK_CANCEL_OPTION 确定/取消
对话框 参数及其含义:
parentComponent 对话框所在的容器
message 提示消息
title 标题
optionType 选择按钮类型
messageType 消息类型
本文地址:https://blog.csdn.net/weixin_45649686/article/details/111915254