java表格界面_Java自学-图形界面 表格
Swing 使用 JTable详解
示例 1 : 基本表格
显示一个Table需要两组数据
一维数组: String[]columnNames 表示表格的标题
二维数组: String[][] heros 表格中的内容
默认情况下,表格的标题是不会显示出来了,除非使用了JScrollPane
package gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTable;
public class TestGUI {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
// 表格上的title
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
// 表格中的内容,是一个二维数组
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros, columnNames);
f.add(t, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 2 : JScrollPane
JScrollPane: 带滚动条的Panel
把table放进去就可以看到table的title
同样的把textarea放进去,并且textarea内容够长的话,就会看到滚动条
package gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TestGUI {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros, columnNames);
// 根据t创建 JScrollPane
JScrollPane sp = new JScrollPane(t);
//或则创建一个空的JScrollPane,再通过setViewportView把table放在JScrollPane中
// JScrollPane sp = new JScrollPane(t);
// sp.setViewportView(t);
// 把sp而非JTable加入到JFrame上,
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 3 : 列宽
设置列宽度
package gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TestGUI {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros, columnNames);
JScrollPane sp = new JScrollPane(t);
// 设置列宽度
t.getColumnModel().getColumn(0).setPreferredWidth(10);
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 4 : TableModel
首先说下TableModel的设计思想,在Model这种思想的指导下,数据和显示分离开来了。 比如对于JTable而言,有数据部分,也有显示部分(比如列宽等信息)。 数据部分,专门做一个类,叫做TableModel,就用于存放要显示的数据。
使用TableModel的方式存放Table需要显示的数据
HeroTableModel 继承AbstractTableModel ,进而实现了接口TableModel
在HeroTableModel 中提供一个table显示需要的所有信息
getRowCount 返回一共有多少行
getColumnCount 返回一共有多少列
getColumnName 每一列的名字
isCellEditable 单元格是否可以修改
getValueAt 每一个单元格里的值
当图形界面需要渲染第一个单元格的数据的时候,就会调用方法TabelModel的getValueAt(0,0) ,把返回值拿到并显示
package gui;
import javax.swing.table.AbstractTableModel;
public class HeroTableModel extends AbstractTableModel {
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "盖伦", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
// 返回一共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return heros.length;
}
// 返回一共有多少列
public int getColumnCount() {
// TODO Auto-generated method stub
return columnNames.length;
}
// 获取每一列的名称
public String getColumnName(int columnIndex) {
// TODO Auto-generated method stub
return columnNames[columnIndex];
}
// 单元格是否可以修改
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
// 每一个单元格里的值
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return heros[rowIndex][columnIndex];
}
}
.
package gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TestGUI {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
//创建一个TableModel
HeroTableModel htm= new HeroTableModel();
//根据 TableModel来创建 Table
JTable t = new JTable(htm);
JScrollPane sp = new JScrollPane(t);
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 5 : 进一步理解TableModel
在使用TableModel之前,是使用
String[] columnNames =。。。
String[][] heros = 。。。
JTable t = new JTable(heros, columnNames);
这样的风格创建一个JTable的
所以实际上调用的是如下的构造方法:
JTable(Object[][] rowData, Object[] columnNames)
如图所示,在JTable的的源代码中,它就会根据rowData和columnNames去创建一个TableModel对象
示例 6 : TableModel 与DAO结合
通过TableModel与DAO结合显示数据库中Hero信息。
DAO使用HeroDAO
在TableModel中,使用从DAO返回的List作为TableModel的数据
只需要修改HeroTableModel,无需修改TestGUI。 这正好演绎了Model设计思想中的数据分离的好处,当只需要数据发生变化的时候,修改Model即可,界面GUI部分,不需要做任何改动
package gui;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import jdbc.HeroDAO;
import charactor.Hero;
public class HeroTableModel extends AbstractTableModel {
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
// 使用从DAO返回的List作为TableModel的数据
public List heros = new HeroDAO().list();
// heros.size返回一共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return heros.size();
}
public int getColumnCount() {
// TODO Auto-generated method stub
return columnNames.length;
}
public String getColumnName(int columnIndex) {
// TODO Auto-generated method stub
return columnNames[columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
// 先通过heros.get(rowIndex)获取行对应的Hero对象
// 然后根据columnIndex返回对应的属性
public Object getValueAt(int rowIndex, int columnIndex) {
Hero h = heros.get(rowIndex);
if (0 == columnIndex)
return h.id;
if (1 == columnIndex)
return h.name;
if (2 == columnIndex)
return h.hp;
if (3 == columnIndex)
return h.damage;
return null;
}
}
示例 7 : TableSelectionModel
通过table可以获取一个 TableSelectionModel,专门用于监听jtable选中项的变化
package gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import charactor.Hero;
public class TestGUI {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
final HeroTableModel htm = new HeroTableModel();
final JTable t = new JTable(htm);
// 准备一个Panel上面放一个Label用于显示哪条被选中了
JPanel p = new JPanel();
final JLabel l = new JLabel("暂时未选中条目");
p.add(l);
JScrollPane sp = new JScrollPane(t);
// 使用selection监听器来监听table的哪个条目被选中
t.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
// 当选择了某一行的时候触发该事件
public void valueChanged(ListSelectionEvent e) {
// 获取哪一行被选中了
int row = t.getSelectedRow();
// 根据选中的行,到HeroTableModel中获取对应的对象
Hero h = htm.heros.get(row);
// 更新标签内容
l.setText("当前选中的英雄是: " + h.name);
}
});
f.add(p, BorderLayout.NORTH);
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 8 : 更新Table
以新增数据到数据库中,然后更新Table为例
package gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import jdbc.HeroDAO;
import charactor.Hero;
public class TestGUI {
public static void main(String[] args) {
JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
final HeroTableModel htm = new HeroTableModel();
final JTable t = new JTable(htm);
// 增加 一个 panel用于放置名称,血量输入框和增加 按钮
JPanel p = new JPanel();
final JLabel lName = new JLabel("名称");
final JTextField tfName = new JTextField("");
final JLabel lHp = new JLabel("血量");
final JTextField tfHp = new JTextField("");
JButton bAdd = new JButton("增加");
tfName.setPreferredSize(new Dimension(80, 30));
tfHp.setPreferredSize(new Dimension(80, 30));
p.add(lName);
p.add(tfName);
p.add(lHp);
p.add(tfHp);
p.add(bAdd);
// 为增加按钮添加监听
bAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
HeroDAO dao = new HeroDAO();
// 根据输入框数据创建一个Hero对象
Hero h = new Hero();
h.name = tfName.getText();
h.hp = Integer.parseInt(tfHp.getText());
// 通过dao把该对象加入到数据库
dao.add(h);
// 通过dao更新tablemodel中的数据
htm.heros = dao.list();
// 调用JTable的updateUI,刷新界面。
// 刷新界面的时候,会到tablemodel中去取最新的数据
// 就能看到新加进去的数据了
t.updateUI();
}
});
JScrollPane sp = new JScrollPane(t);
f.add(p, BorderLayout.NORTH);
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 9 : 输入项验证
如果用户输入的名称为空,或者血量不是小数,在提交数据的时候都会报错。
“感觉上” 界面就卡住了。 这是不友好的人机交互行为。
所以需要加上输入项的验证,如果输入的数据不合格,应该弹出对话框提示用户具体原因。
package gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import jdbc.HeroDAO;
import charactor.Hero;
public class TestGUI {
public static void main(String[] args) {
final JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
final HeroTableModel htm = new HeroTableModel();
final JTable t = new JTable(htm);
JPanel p = new JPanel();
final JLabel lName = new JLabel("名称");
final JTextField tfName = new JTextField("");
final JLabel lHp = new JLabel("血量");
final JTextField tfHp = new JTextField("");
JButton bAdd = new JButton("增加");
tfName.setPreferredSize(new Dimension(80, 30));
tfHp.setPreferredSize(new Dimension(80, 30));
p.add(lName);
p.add(tfName);
p.add(lHp);
p.add(tfHp);
p.add(bAdd);
bAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
HeroDAO dao = new HeroDAO();
Hero h = new Hero();
String name = tfName.getText();
// 通过name长度判断 名称是否为空
if (name.length() == 0) {
// 弹出对话框提示用户
JOptionPane.showMessageDialog(f, "名称不能为空");
// 名称输入框获取焦点
tfName.grabFocus();
return;
}
String hp = tfHp.getText().trim();
try {
// 把hp转换为浮点型,如果出现异常NumberFormatException表示不是浮点型格式
Float.parseFloat(hp);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(f, "血量只能是小数 ");
tfHp.grabFocus();
return;
}
h.name = name;
h.hp = Float.parseFloat(hp);
dao.add(h);
htm.heros = dao.list();
t.updateUI();
}
});
JScrollPane sp = new JScrollPane(t);
f.add(p, BorderLayout.NORTH);
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
示例 10 : 选中指定行
table初始化后,应该默认选中第一行
增加数据后,也应该选中新增的这一条
package gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import jdbc.HeroDAO;
import charactor.Hero;
public class TestGUI {
public static void main(String[] args) {
final JFrame f = new JFrame("LoL");
f.setSize(400, 300);
f.setLocation(200, 200);
f.setLayout(new BorderLayout());
final HeroTableModel htm = new HeroTableModel();
final JTable t = new JTable(htm);
// 设置选择模式为 只能选中一行
t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 选中第一行 (基本0)
t.getSelectionModel().setSelectionInterval(0, 0);
JPanel p = new JPanel();
final JLabel lName = new JLabel("名称");
final JTextField tfName = new JTextField("");
final JLabel lHp = new JLabel("血量");
final JTextField tfHp = new JTextField("");
JButton bAdd = new JButton("增加");
tfName.setPreferredSize(new Dimension(80, 30));
tfHp.setPreferredSize(new Dimension(80, 30));
p.add(lName);
p.add(tfName);
p.add(lHp);
p.add(tfHp);
p.add(bAdd);
bAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
HeroDAO dao = new HeroDAO();
Hero h = new Hero();
String name = tfName.getText();
if (name.length() == 0) {
JOptionPane.showMessageDialog(f, "名称不能为空");
tfName.grabFocus();
return;
}
String hp = tfHp.getText().trim();
try {
Float.parseFloat(hp);
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(f, "血量只能是小数 ");
tfHp.grabFocus();
return;
}
h.name = name;
h.hp = Float.parseFloat(hp);
dao.add(h);
htm.heros = dao.list();
t.updateUI();
// 选中 第一行 ,因为 DAO是按照 ID倒排序查询,所以第一行就是新加入的数据
t.getSelectionModel().setSelectionInterval(0, 0);
}
});
JScrollPane sp = new JScrollPane(t);
f.add(p, BorderLayout.NORTH);
f.add(sp, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
java表格界面_Java自学-图形界面 表格相关推荐
- java图形界面_Java自学-图形界面 面板
Swing 四种常见面板 示例 1 : 基本面板 JPanel即为基本面板 面板和JFrame一样都是容器,不过面板一般用来充当中间容器,把组件放在面板上,然后再把面板放在窗体上. 一旦移动一个面板 ...
- java怎么开发图形界面_Java Swing 图形界面开发简介
1. Swing简介 Swing 是 Java 为图形界面应用开发提供的一组工具包,是 Java 基础类的一部分. Swing 包含了构建图形界面(GUI)的各种组件,如: 窗口.标签.按钮.文本框等 ...
- 实验楼Java写计算器_Java版图形界面计算器
Java 版图形界面计算器 实验说明及介绍 环境登录 无需密码自动登录,系统用户名 shiyanlou,密码 shiyanlou 环境介绍 本实验环境采用带桌面的 Ubuntu Linux 环境,实验 ...
- java工具栏_Java自学-图形界面 工具栏
Swing如何使用工具栏JToolBar 工具栏用于存放常用的按钮 步骤 1 : 工具栏 package gui; import java.awt.BorderLayout; import javax ...
- java 界面 菜单栏_Java自学-图形界面 菜单
如何在Swing中使用菜单JMenu GUI的菜单分为 菜单栏,菜单和菜单项 步骤 1 : 菜单栏和菜单 菜单栏和菜单 package gui; import javax.swing.JFrame; ...
- CentOS 7安装和配置的基础教程,字符界面下安装图形界面,图形界面和字符界面的切换
CentOS 7安装教程: 准备阶段: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso CentOS 7.9(2009) 下载:页面加载 ...
- java图形界面制作表格,Java自学-图形界面 表格
Swing 使用 JTable详解 示例 1 : 基本表格 显示一个Table需要两组数据 一维数组: String[]columnNames 表示表格的标题 二维数组: String[][] her ...
- java综合图形界面程序设计_java综合图形界面程序设计.doc
java综合图形界面程序设计.doc 还剩 10页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: [键入文字]10四.实验小结(包括问题和解决方法.心得 ...
- java gui 层次结构_javaGUI教学图形界面的层次结构.ppt
第六章GUI Graphics User Interface图形用户界面 浅谈图形界面开发 最常见的图形界面:windows操作系统 学习GUI的方法与内容 一.图形对象的布局(显示的内容如何摆放) ...
最新文章
- Windows 7平台安装Oracle Client 10g版本时需要做的一点变更
- CSS_DIV学习记录2(用背景颜色实现一个网页的完整布局)
- window SDK自定义安装路径选择
- ubuntu下配置php环境
- firefox扩展开发(八) :控件激活
- antvue 有赞布局_UI大全:前端UI框架集合(持续更新,当前32个)
- 天梯—计算阶乘和(C语言)
- Gstreamer插件编译安装的Makefile
- C++链式队列实现简易银行叫号系统
- 一位acm过来人的心得
- Visual C++网络编程经典案例详解 第9章 实用播放器 编程基础 播放mp3文件 读取文件
- 【ROS基础】ROS_c++ 语法记录
- 什么是视觉特效师,我如何才能成为一名艺术家?
- android gpuimage 直播,1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜...
- xv6进程切换-swtch函数
- 昨天介入600571,信雅达,喜欢的朋友可以跟进!
- 基于机器学习的车辆检测算法研究方法概述
- js 计算精确度问题——基础积累
- 简单聊聊FPGA的一些参数
- 如何用MathType编辑圆圈符号