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);
}
}
}
