1-Java提供的对GUI的支持
GUI(Graphics User Interface)图形用户接口,此处的接口是指用户可以直接操纵用于和程序进行人机交互的图形化界面
GUI组成:容器(Container)和组件(Component),Component是Container的父类,因为容器也是一种特殊的 组件
java提供两套GUI组件(包含容器)
1. awt(abstarct window toolkit),抽象窗体工具集,不可跨平台
2. swing(摇摆),可跨平台
awt和swing的区别
1、awt是不可跨平台的,因为awt中所有和图形相关的组件都依赖于本地操作系统中的同位体(peer),例如,awt中的一个按钮对应的其实就是操作系统中的按钮,awt的所有图形组件都与操作系统的图形函数库有一一对应关系,这就导致在一个操作系统中做出来的awt软件一旦移植到其他操作系统就无法实现,因此,awt是不可跨平台的。而swing把awt中所有图形组件用java重新实现了。不再“借用”操作系统的同位体,因此,swing是可以跨平台的。
2、awt是重量级组件,核心代码达到6~7M,而swing是轻量级组件,核心代码不足1M。核心代码量大占用系统资源就会大,所以是重量级,而swing核心代码量少,对系统资源占用少,所以是轻量级。
3、swing并不是完全取代awt,因为awt中除了图形组件以外,还有一些内容和图形无关,例如,颜色,字体,布局管理器,这些和图形无关的内容可以跨平台,swing对于这一部分没有重新实现。
所以awt的颜色,字体,布局是学习重点,而swing中的组件就是重点,因为这些都是可以跨平台的
import javax.swing.*;
import java.awt.*;
public class AWTdemo {
public static void main(String[] args) {
Frame f=new Frame();
f.setSize(400,400);
f.setTitle("demotitle");
f.setBackground(Color.CYAN);
// 取消默认布局管理器,不然设置组件位置没有效果
f.setLayout(null);
JButton jButton=new JButton("确定");
jButton.setSize(150,50);
jButton.setLocation(200,200);
jButton.setFont(new Font("楷体",Font.BOLD,18));
f.add(jButton);
// f.add(btn);
// ????????��???????��??
Dimension dimension=Toolkit.getDefaultToolkit().getScreenSize();
int width= dimension.width;
int heigt= dimension.height;
f.setLocation((width-f.getWidth())/2,(heigt-f.getHeight())/2);
// 显示窗体
f.setVisible(true);
}
}
布局管理器的作用
容器中的组件大小和位置会受布局管理器的管理(LayoutManger接口)
LayoutManger的实现类
1、BorderLayout(边框布局,麻将布局),把整个布局分成东南西北中五个区域,每个区域允许放置一个组件,组件会随着窗体的大小而等比例改变,而相对位置不变,
Frame,JFrame(swing),Dialog,JDialog(swing)四个容器是以BorderLayout作为默认的布局管理器
2、FlowLayout(Panel,JPanel(swing的一个组件))的默认布局,它将组件有向(从前往后)依次排列,若一行没有位置,自动放入下一行,组件不会随窗体大小发生变化,但相对位置可能发生变化。
3、GridLayout(网格布局),把容器分成若干个单元格,每个单元格只能放置一个组件。
2-Swing实现QQ登录
目录结构
模拟数据库储存用户信息的db.properties文件
自定义图片面板ImagePanel
package com.swingchuangti.tf;
import java.awt.Graphics;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class ImagePanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
ImageIcon icon=new ImageIcon(ImagePanel.class.getResource("/images/bg.jpg"));
// 参数起始位置0 0 缩放比例大小 400,192
g.drawImage(icon.getImage(), 0, 0, 400,192,this);
}
}
图片处理的工具类ImageUtil
package com.util;
import java.awt.Image;
import java.net.URL;
import javax.swing.Icon;
import javax.swing.ImageIcon;
public class ImageUtil {
public static Image getImageByPath(String path){
URL url=ImageUtil.class.getResource(path);
ImageIcon icon=new ImageIcon(url);
return icon.getImage();
}
public static Icon getIconByPath(String path){
URL url=ImageUtil.class.getResource(path);
ImageIcon icon=new ImageIcon(url);
return icon;
}
}
登录主页面的创建SwingQQLogin
package com.swingchuangti.tf;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import com.util.ImageUtil;
@SuppressWarnings("serial")
public class SwingQQLogin extends JFrame{
private JLabel lblAccountNO,lblPassword;
private JPanel panBg,panConpanents;
private JTextField txtAccontNo;
private JPasswordField txtPassword;
private JButton btnLogin,btnRegister;
public SwingQQLogin(){
init();
}
public static void main(String[] args) {
new SwingQQLogin();
}
public JButton getBtnLogin() {
if(btnLogin==null){
btnLogin=new JButton("登录");
btnLogin.setFont(new Font("楷书",Font.BOLD,16));
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
loginvalite();
}
});
}
return btnLogin;
}
public JButton getBtnRegister() {
if(btnRegister==null){
btnRegister=new JButton("注册");
btnRegister.setFont(new Font("楷书",Font.BOLD,16));
}
return btnRegister;
}
public JTextField getTxtAccontNo() {
if(txtAccontNo==null){
txtAccontNo=new JTextField(16);// 构造一个具有指定列数的新的空 TextField。
}
return txtAccontNo;
}
public JPasswordField getTxtPassword() {
if(txtPassword==null){
txtPassword=new JPasswordField(16);
txtPassword.setEchoChar('*');
txtPassword.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER){
loginvalite();
}
}
});
}
return txtPassword;
}
public JPanel getPanBg() {
if(this.panBg==null){
this.panBg=new ImagePanel();
}
return panBg;
}
public JPanel getPanConpanents() {
if(this.panConpanents==null){
this.panConpanents=new JPanel();
this.panConpanents.add(this.getLblAccountNO());
this.panConpanents.add(this.getTxtAccontNo());
this.panConpanents.add(this.getLblPassword());
this.panConpanents.add(this.getTxtPassword());
this.panConpanents.add(this.getBtnRegister());
this.panConpanents.add(this.getBtnLogin());
}
return panConpanents;
}
public JLabel getLblAccountNO() {
if(lblAccountNO==null){
lblAccountNO=new JLabel("账号",ImageUtil.getIconByPath("/images/red_you.png"),JLabel.CENTER);
}
return lblAccountNO;
}
public JLabel getLblPassword() {
if(lblPassword==null){
lblPassword=new JLabel("密码",ImageUtil.getIconByPath("/images/red_you.png"),JLabel.CENTER);
}
return lblPassword;
}
private void loginvalite() {
// 从文本框读取内容
String accountNo=txtAccontNo.getText().trim();
if(accountNo==null||accountNo.equals("")){
JOptionPane.showMessageDialog(SwingQQLogin.this, "账号不能为空!");
txtAccontNo.requestFocus();
return;
}
// 提取密码
String password=String.valueOf(txtPassword.getPassword());
if(password==null||password.equals("")){
JOptionPane.showMessageDialog(SwingQQLogin.this, "密码不能为空");
txtPassword.requestFocus();
return;
}
// 正确性验证
InputStream is=SwingQQLogin.class.getResourceAsStream("/db.properties");
Properties pro=new Properties();
try {
pro.load(is);
String db_accountNo=pro.getProperty("accountNo");
String db_accountPassword=pro.getProperty("accountPassword");
if(db_accountNo.equals(accountNo)&&db_accountPassword.equals(password)){
JOptionPane.showMessageDialog(SwingQQLogin.this, "登录成功");
}else{
JOptionPane.showMessageDialog(SwingQQLogin.this, "账号或密码错误");
txtPassword.setText("");
txtPassword.requestFocus();
}
} catch (IOException e1) {
JOptionPane.showMessageDialog(SwingQQLogin.this, "访问数据库失败!");
}
}
private void init() {
this.setSize(280, 344);
this.setTitle("QQ2018");
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int sw=screenSize.width;
int sh=screenSize.height;
this.setLocation((sw-this.getWidth())/2,(sh-this.getHeight())/2);
addConpants();
this.setResizable(false);//设置尺寸不可变
this.setVisible(true);
}
private void addConpants() {
this.setLayout(new GridLayout(2,1));
this.add(this.getPanBg());
this.add(this.getPanConpanents());
}
}
效果图
3-Swing实现QQ登录后的主窗体
结构目录
主函数改动
别的地方都不用动,只需要登录成功的地方做以下改动,跳转到主页面,并关闭登录页面
主页面
package com.swingchuangti.tf;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
@SuppressWarnings("serial")
public class MainFrame extends JFrame{
private JMenuBar mbar;
private JMenu itemNew, menuFile,menuEdit,menuMst;
private JMenuItem itemOpen,itemSave,itemStuShow,itemSwing,itemDialog;
private JMenuItem getItemSwing() {
if(itemSwing==null){
this.itemSwing=new JMenuItem("窗体");
}
return itemSwing;
}
private JMenuItem getItemDialog() {
if(itemDialog==null){
this.itemDialog=new JMenuItem("对话框");
}
return itemDialog;
}
private JMenu getItemNew() {
if(itemNew==null){
this.itemNew=(JMenu) new JMenu("新建");//也可以添加图片
this.itemNew.add(this.getItemSwing());
this.itemNew.add(this.getItemDialog());
}
return itemNew;
}
private JMenuItem getItemOpen() {
if(itemOpen==null){
this.itemOpen=new JMenuItem("打开");//也可以添加图片
}
return itemOpen;
}
private JMenuItem getItemSave() {
if(itemSave==null){
this.itemSave=new JMenuItem("保存");//也可以添加图片
}
return itemSave;
}
private JMenuItem getItemStuShow() {
if(itemStuShow==null){
this.itemStuShow=new JMenuItem("显示学生信息");//也可以添加图片
}
return itemStuShow;
}
private JMenu getMenuFile() {
if(menuFile==null){
this.menuFile=new JMenu("文件");
this.menuFile.add(this.getItemNew());
this.menuFile.add(this.getItemOpen());
this.menuFile.add(this.getItemSave());
}
return menuFile;
}
private JMenu getMenuEdit() {
if(menuEdit==null){
this.menuEdit=new JMenu("编辑");
}
return menuEdit;
}
private JMenu getMenuMst() {
if(menuMst==null){
this.menuMst=new JMenu("学生管理");
this.menuMst.add(this.getItemStuShow());
}
return menuMst;
}
private JMenuBar getMbar() {
if(mbar==null){
this.mbar=new JMenuBar();
// ②菜单栏中加载菜单
this.mbar.add(this.getMenuFile());
this.mbar.add(this.getMenuEdit());
this.mbar.add(this.getMenuMst());
}
return mbar;
}
public MainFrame(){
init();
}
private void init() {
this.setSize(600, 500);
this.setTitle("主窗体");
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
int sw=screenSize.width;
int sh=screenSize.height;
this.setLocation((sw-this.getWidth())/2,(sh-this.getHeight())/2);
addConpants();
this.setResizable(false);//设置尺寸不可变
this.setVisible(true);
// 取消JFrame的关闭默认操作,默认关闭取消都会隐藏当前窗体,取消后自己设置
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int answer=JOptionPane.showConfirmDialog(MainFrame.this, "确认关闭?");
if(answer==JOptionPane.OK_OPTION){
MainFrame.this.dispose();
}
}
});
}
private void addConpants() {
this.setJMenuBar(this.getMbar());;//①面板中加载菜单栏
}
}