Skip to content

20.GUI

1.GUI 介绍

图形用户接口

通过java应用程序提供给用户操作的图形界面,包括窗口、菜单栏、工具条、按钮等组件和其他各种屏幕元素

2.常用 组件/容器

2.1 JFrame 窗口

java
package com.neuedu.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

public class Demo01 {
	
	public static void main(String[] args) {
		
		JFrame window = new JFrame("demo");
		
		window.setSize(300,200);
		window.setLocation(100, 100);
		
		//当点x的时候退出程序
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		//添加菜单
		JMenuBar menubar = new JMenuBar();
		
		//菜单项
		JMenu file = new JMenu("File");
		//添加菜单
		JMenuItem openItem = new JMenuItem("Open");
		
		//给 openItem 添加事件 监听器
		openItem.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//当产生动作事件
				System.out.println("菜单被调用了....");
				JOptionPane.showMessageDialog(null, "模拟打开文件");
				
			}
		});
		
		JMenuItem exit = new JMenuItem("Exit");
		file.add(openItem);
		file.add(exit);
		
		
		JMenu edit = new JMenu("Edit");
		
		menubar.add(file);
		menubar.add(edit);
		
		window.setJMenuBar(menubar);
		
		
		
		window.setVisible(true);
		
	}

}

事件,程序需要监听具体事件,然后接受到事件之后处理自己的业务逻辑

2.2 JPanel 面板

布局管器: 用于设置容器中 组件如何摆放

java
package com.neuedu.gui;

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyPanel {

	public static void main(String[] args) {
		JFrame window = new JFrame("demo");

		window.setSize(600, 450);
		window.setLocation(100, 100);

		// 当点x的时候退出程序
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		
		
		JPanel pan = new JPanel();
		pan.setBackground(Color.BLACK);
		//布局管理器
		pan.setLayout(null);//相对布局
		
		
		//設置容器中的組件
		
		JButton btn = new JButton("普通按鈕");
		btn.setBounds(10, 10, 100, 20);
		pan.add(btn);
		
		JTextField txt = new JTextField();
		txt.setBounds(10, 40, 100, 20);
		pan.add(txt);
		
		//將Pan 放到Windows中
		window.getContentPane().add(pan);
		
		
		window.setVisible(true);
		
	}
}

2.3 布局管理器

Java 提供了布局管理器来管理组件在容器中的布局,java.awt 包中常用的布局管理器类有: BorderLayout-边界布局 FlowLayout-流式布局 CardLayout-卡片布局 GridLayout-网格布局 GridBagLayout-网袋布局

BorderLayout(边界布局管理器)

BorderLayout 将容器划分为东、南、西、北、中五个区域,可以将组件分放在这五个区域中。 原则上,BorderLayout 允许最多放置五个组件,而可借助面板类 Panel 添加更多的组件。 BorderLayout 是窗口体(JFrame)的默认布局

java
package com.neuedu.gui;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyBorderLayout {

	public static void main(String[] args) {
		JFrame jFrame = new JFrame("边界布局");
		
//		jFrame.setLocale(l);
//		jFrame.setSize(width, height);
		
		jFrame.setBounds(10, 10, 700, 500);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		jFrame.add(new JButton("第一个按钮") ,  BorderLayout.NORTH);
		jFrame.add(new JButton("第二个按钮"),  BorderLayout.SOUTH);
		jFrame.add(new JButton("第三个按钮"),  BorderLayout.WEST);
		jFrame.add(new JButton("第四个按钮"),  BorderLayout.EAST);
		jFrame.add(new JButton("第五个按钮"),  BorderLayout.CENTER);
	
		
		
		
		jFrame.setVisible(true);//显示界面
		
	}
	
}

FlowLayout(流式布局管理器)

FlowLayout 把容器中的组件从左到右,从上到下依次排列。 如果某容器采用 FlowLayout 布局,那么其add方法中指定的位置参数将被忽略。 当容器窗口大小改变时,组件的位置可能会发生变化,但组件尺寸不变。

默认居中对齐

  • align:对齐方向
    • FlowLayout.left
    • FlowLayout.right
    • FlowLayout.center
  • hgap :水平方向 控件与控件的 间距

FlowLayout 是面板(JPanel)的默认布局

java
package com.neuedu.gui;

import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyPanel {

	public static void main(String[] args) {
		JFrame window = new JFrame("demo");

		window.setSize(600, 450);
		window.setLocation(100, 100);

		// 当点x的时候退出程序
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		
		
		JPanel pan = new JPanel();
		pan.setBackground(Color.BLACK);
		//布局管理器
//		pan.setLayout(null);//相对布局
		
		
		//設置容器中的組件
		
		JButton btn = new JButton("普通按鈕");
//		btn.setBounds(10, 10, 100, 20);
		pan.add(btn);
		
		for (int i = 0; i < 20; i++) {
			JButton btntem = new JButton("普通按鈕"+i);
//			btn.setBounds(10, 10, 100, 20);
			pan.add(btntem);
		}
		
//		JTextField txt = new JTextField();
//		txt.setBounds(10, 40, 100, 20);
//		pan.add(txt);
		
		//將Pan 放到Windows中
		window.getContentPane().add(pan);
		
		
		window.setVisible(true);
		
	}
}

自定义的 布局

java
package com.neuedu.gui;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyLayout {

	public static void main(String[] args) {
		//自定义布局管理器
		
//		JFrame  的默认布局管理器     边界布局  Borderlayout
//		JPanel  的默认布局管理器     流式布局  FlowLayout
		
		
		//测试 自定义 流式布局
		
		testBorder();
	}

	
	//测试 自定义 流式布局
	private static void testBorder() {
		JFrame  j1 = new JFrame();
		j1.setLayout(new FlowLayout(FlowLayout.LEFT,40,20)); //流式布局
		
		
		for (int i = 0; i < 30; i++) {
			j1.add(new JButton("普通按钮"+i));
		}
		
		
		//设置窗口大小
		j1.setBounds(10, 10, 700, 650);
		
		j1.setVisible(true);//重绘的机制
	}
	
}

取消布局管理器/设置各组件的大小和位置

java
package com.neuedu.gui;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyLayout {

	public static void main(String[] args) {
		//自定义布局管理器
		
//		JFrame  的默认布局管理器     边界布局  Borderlayout
//		JPanel  的默认布局管理器     流式布局  FlowLayout
		
		
		//测试 自定义 流式布局
		
//		testBorder();
		
		//取消布局管理器
		testUnLayout();
	}

	
	private static void testUnLayout() {
		JFrame  j1 = new JFrame();
		j1.setLayout(null); //流式布局
		
		
		for (int i = 0; i < 10; i++) {
			JButton btn = new JButton("普通按钮"+i);
			btn.setBounds(10, (i*25), 100, 20);
			j1.add(btn);
		}
		
		
		//设置窗口大小
		j1.setBounds(10, 10, 700, 650);
		
		j1.setVisible(true);//重绘的机制
		
		
		
	}


	//测试 自定义 流式布局
	private static void testBorder() {
		JFrame  j1 = new JFrame();
		j1.setLayout(new FlowLayout(FlowLayout.LEFT,40,20)); //流式布局
		
		
		for (int i = 0; i < 30; i++) {
			j1.add(new JButton("普通按钮"+i));
		}
		
		
		//设置窗口大小
		j1.setBounds(10, 10, 700, 650);
		
		j1.setVisible(true);//重绘的机制
	}
}

2.4 JDialog 弹出框

用于展示简单的界面的。

java
package com.neuedu.gui;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class MyJDialog {

	
	//psvm   --IDEA  
	public static void main(String[] args) {
		//JDialog
		
		JDialog dialog = new JDialog(new JFrame(), "xxx系统登录");
		dialog.setLayout(null);//取消布局管理器
		
		JLabel lblUserName = new JLabel("用户名");
		lblUserName.setBounds(10,10,70,30);
		dialog.add(lblUserName);
		JLabel lblPassword = new JLabel("密码");
		lblPassword.setBounds(10,50,150,30);
		dialog.add(lblPassword);
		
		JTextField txtUsername = new JTextField();
		txtUsername.setBounds(90,10,150,30);
		dialog.add(txtUsername);
		
		
		JPasswordField txtPassword = new JPasswordField();
		txtPassword.setBounds(90,50,150,30);
		dialog.add(txtPassword);
		
		dialog.setBounds(10, 10, 400, 300);
		dialog.setVisible(true);
	}
	
	
}

2.5常用组件

文本输入组件:

文本框(JTextField)、密码域(JPasswordField)、文本域(JTextArea)、标签(JLabel)

按钮组件:

普通按钮(JButton)、复选框(JCheckBox)、单选按钮(JRadioButton)

下拉列表框(JComboBox)

java
package com.neuedu.gui;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.HeadlessException;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 常用组件
 * @author Administrator
 *
 */
public class MyComponent extends JFrame {

	
	public MyComponent() throws HeadlessException {
		
		
		//测试常用组件
		setLayout(new FlowLayout(FlowLayout.LEFT)); //不想设置组件的 宽、高、x、y
		initComponet();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(10,10,700,500);
		setVisible(true);
	}
	
	
	
	
	
	

	private void initComponet() {
		//文本 \ 标签
		//按钮  普通按钮  单选按钮、 复选框
		//表格  、树形结构
		/**
		 * 文本输入组件:文本框(JTextField)、密码域(JPasswordField)、文本域(JTextArea)、标签(JLabel)
			按钮组件:普通按钮(JButton)、复选框(JCheckBox)、单选按钮(JRadioButton)
			下拉列表框(JComboBox)
		 */
		
		JLabel  jLabel = new JLabel("标签");
		add(jLabel);
		
		//CTRL  +SHIFT +O  批量导报
		JTextField  jtext = new JTextField();
//		jtext.setSize(500, 30);  //再没有布局管理器的时候使用
		
		jtext.setPreferredSize(new Dimension(100,30));
		add(jtext);	
		
		JPasswordField  jPasswordField = new JPasswordField();
		jPasswordField.setPreferredSize(new Dimension(100,30));
		add(jPasswordField);
		
		JTextArea  jTextArea = new JTextArea();
		jTextArea.setPreferredSize(new Dimension(300,60));
		add(jTextArea);
		

		JButton  btn1 = new JButton("普通按钮");
		add(btn1);
		
		JCheckBox  ck1 = new JCheckBox("篮球");
		add(ck1);
		JCheckBox  ck2 = new JCheckBox("乒乓球");
		add(ck2);
		JCheckBox  ck3 = new JCheckBox("游泳");
		add(ck3);
		
		ButtonGroup genderGroup = new ButtonGroup();
		JRadioButton  rdo1 = new JRadioButton("男");
		add(rdo1);
		JRadioButton  rdo2 = new JRadioButton("女");
		add(rdo2);
		genderGroup.add(rdo1);
		genderGroup.add(rdo2);
		
		String[] provinceList = {"黑龙江","辽宁","云南","湖广"};
		JComboBox  province = new JComboBox(provinceList);
		add(province);
	}


	public static void main(String[] args) {
		new MyComponent();
	}
}

2.6 表格组件

简单表格

java
package com.neuedu.gui;

import java.awt.HeadlessException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class MyTable  extends JFrame{

	
	//初始化 自定义表格界面
	public MyTable() throws HeadlessException {
		
		JScrollPane jScrollPane = new JScrollPane();
		
		JTable table = new JTable();
		
		
		//设置表格的显示行为
		String[] columnNames = new String[] {"序号","年龄","性别"};
		String[][] data = {
				{"1","张三","男"},
				{"2","李四","女"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"3","王五","男"},
				{"99","王五","男"}
				
		};
		DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
		
		table.setModel(dtm);//使用DefaultTableModel填充表格
		
		//把表格放到滚动容器
		jScrollPane.getViewport().add(table);
		this.add(jScrollPane);
		
		this.setBounds(10, 10, 700,500);
		this.setVisible(true);
		
	}

	
	//main 程序的入口
	public static void main(String[] args) {
		new MyTable();
	}
}

自定义渲染表格

java
package com.neuedu.gui;

import java.awt.Component;
import java.awt.HeadlessException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

import com.neuedu.domain.Student;

public class MyTable extends JFrame {

	// 初始化 自定义表格界面
	public MyTable() throws HeadlessException {

		JScrollPane jScrollPane = new JScrollPane();

		JTable table = new JTable();

		// 设置表格的显示行为
//		String[] columnNames = new String[] {"序号","年龄","性别"};
//		String[][] data = {
//				{"1","张三","男"},
//				{"2","李四","女"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"3","王五","男"},
//				{"99","王五","男"}
//				
//		};

//		DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
//		table.setModel(dtm);// 使用DefaultTableModel填充表格
		
		

		// 模拟从数据库查询出来很多个学生
		List<Student> stuList = new ArrayList<Student>();
		for (int i = 0; i < 30; i++) {
			stuList.add(new Student(i, "张三" + i, "男" + i));
		}
		table.setModel(new MyStudentDefaultTableModel(stuList));// 使用DefaultTableModel填充表格

		
		//修改最后一列的渲染方式
		TableColumnModel lastColumnModel = table.getColumnModel();
		TableColumn latColumn = lastColumnModel.getColumn(3);
		latColumn.setCellRenderer(new MyDefaultTableCellRenderer()); //默认显示
		latColumn.setCellEditor(new MyDefaultCellEditor(new JTextField())); //编辑状态下的行为
		

		// 把表格放到滚动容器
		jScrollPane.getViewport().add(table);
		this.add(jScrollPane);

		this.setBounds(10, 10, 700, 500);
		this.setVisible(true);

	}

	
	//渲染表格
	class MyStudentDefaultTableModel extends DefaultTableModel {
		
		private List<Student> stuList = new ArrayList();
		
		//使用构造器 接受外部传递的 数据
		public MyStudentDefaultTableModel(List<Student> stuList) {
			this.stuList = stuList;
		}
		
		
	
		String[] columnNames = new String[] {"序号","年龄","性别","操作"};

		
		//通知表格渲染应该有多少个列
		@Override
		public int getColumnCount() {
			// TODO Auto-generated method stub
			return columnNames.length;
		}

		//通知表格渲染应该有多少个列表头
		@Override
		public String getColumnName(int column) {
			// TODO Auto-generated method stub
			return columnNames[column];
		}
		
		
		
		//通知表格应该显示多少行
		@Override
		public int getRowCount() {
			return stuList==null? 0: stuList.size();
		}

		
		//通知表格渲染 某一个具体单元格的内容
		@Override
		public Object getValueAt(int row, int column) {
			Student stu = stuList.get(row);//找到某一行对应的学生
			
			//0 ---- 
			if(column == 0) {
				return stu.getId();
			} else if(column == 1) {
				return stu.getName();
			}else if(column == 2) {
				return stu.getGender();
			}else if(column == 3) {
				return stu; //最后的操作列
			}
			
			return null;
		}


		
		

	}
	
	
	
	//定义最后一列渲染方式
	class MyDefaultTableCellRenderer extends DefaultTableCellRenderer{

		
		//获取渲染单元格的时候  张什么样
		@Override
		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			// TODO Auto-generated method stub
			return new JButton("编辑");
		}
		
	}
	
	//设置修改器
	class MyDefaultCellEditor extends DefaultCellEditor{

		public MyDefaultCellEditor(JTextField textField) {
			super(textField);
		}

		//获取表格修改状态下的 显示组件
		@Override
		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
				int column) {
			// TODO Auto-generated method stub
			return new JButton("编辑");
        }
		
	}
	
	

	// main 程序的入口
	public static void main(String[] args) {
		new MyTable();
	}

}

实体类

java
package com.neuedu.domain;

import java.util.ArrayList;
import java.util.List;

public class Student {

	private Integer id;
	private String name;
	private String gender;
	
	

	public Student() {
		super();
	}

	//为了方便快速的创建对象
	public Student(Integer id, String name, String gender) {
		super();
		this.id = id;
		this.name = name;
		this.gender = gender;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}
	
	//为了测试方便 ,重写toString
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", gender=" + gender + "]";
	}

	
	public static void main(String[] args) {
		
		//模拟从数据库查询出来很多个学生
		List<Student> stu = new ArrayList<Student>();
		
		for (int i = 0; i < 20; i++) {
			stu.add(new Student(i,"张三"+i,"男"+i));
		}
	
		
		for (Student student : stu) {
			System.out.println(student);
		}
		
	}

}

Released under the MIT License.