JTable组件使用的是模型/视图/控制器的设计方式,将可视化组件从其数据中分离出来,因此表格中的数据都封装在数据模型中。其中最重要的支持类就是TableModel类,这个类用来定义JTable类以及其数据模型之间的接口。
创建一个简单的表格:
import java.awt.*;
import javax.swing.*;
public class SimpleTableTest extends JFrame{ private static final long serialVersionUID = 1L;
protected JTable table;
protected Object[][] data;
protected String[] colname = {"编号","书名","作者","主角","类别","选择"};
public SimpleTableTest(){
Container pane = getContentPane();
pane.setLayout(new BorderLayout());
createTableData(); //创建表格所需数据
table = getSimpleTable();
JScrollPane jsPane = new JScrollPane(table);
pane.add(jsPane,BorderLayout.CENTER);
}
public void createTableData(){
data = new Object[10][6];
int i =0;
data[i++] = new Object[]{"01","射雕英雄传","金庸","郭靖","武侠",true};
data[i++] = new Object[]{"02","神雕侠侣" ,"金庸","杨过","武侠",false};
data[i++] = new Object[]{"03","笑傲江湖" ,"金庸","令狐冲","武侠",true};
data[i++] = new Object[]{"04","鹿鼎记" ,"金庸","韦小宝","武侠",false};
data[i++] = new Object[]{"05","大旗英雄传" ,"古龙","铁中棠","武侠",false};
data[i++] = new Object[]{"06","陆小凤传奇" ,"古龙","陆小凤","武侠",false};
data[i++] = new Object[]{"07","多情剑客无情剑" ,"古龙","李寻欢","武侠",false};
data[i++] = new Object[]{"08","三国演义" ,"罗贯中","无","古典名著",false};
data[i++] = new Object[]{"09","封神演义" ,"陈仲琳","无","古典名著",false};
data[i++] = new Object[]{"10","绿野仙踪" ,"李百川","冷于冰","古典名著",false};
}
public static void main(String[] args){
SimpleTableTest stt= new SimpleTableTest();
stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
stt.setSize(400, 200);
stt.setVisible(true);
}
/**
* 返回一个简单的表格
* @return
*/
public JTable getSimpleTable(){
table = new JTable(data,colname);
return table;
}
}
运行结果如下图所示:
虽然没有创建表格模型,但是JTable的构造函数默认创建了一个表格模型。
public JTable(final Object[][] rowData, final Object[] columnNames) {
this(new AbstractTableModel() {
public String getColumnName(int column) { return columnNames[column].toString(); }
public int getRowCount() { return rowData.length; }
public int getColumnCount() { return columnNames.length; }
public Object getValueAt(int row, int col) { return rowData[row][col]; }
public boolean isCellEditable(int row, int column) { return true; }
public void setValueAt(Object value, int row, int col) {
rowData[row][col] = value;
fireTableCellUpdated(row, col);
}
});
}
该构造函数实现了AbstractTableModel类。上述六种方法的作用是:返回表格的列名,返回行数,返回列数,返回特定单元格的值,判断特定单元格是否可编辑,设置特定单元格的值。
另外Java也提供了另外一种类DefaultTableModel类来实现TableModel接口。
AbstractTableModel与DefaultTableModel的区别
简单来说,DefaultTableModel使用起来要容易一些,但是DefaultTableModel在使用时会将所有的数据加载到内存中,因此适合表格中只含有少量数据时使用。而AbstractTableModel适合显示大量数据时使用,它不会将所有数据都载入内存,只有在需要时才会加载数据,从而最小限度的使用内存。
设置表格的样式
/**
* 设置表格风格
* @param tb
*/
public void setSimpleTableStyle(JTable tb){
//设置表头的背景色
tb.getTableHeader().setBackground(Color.BLUE);
//设置表头的文字颜色
tb.getTableHeader().setForeground(Color.RED);
//设置表头字体
tb.getTableHeader().setFont(new Font("隶书",Font.PLAIN,14));
// 设置行高
tb.setRowHeight(30);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.getColumn(colname[0]).setPreferredWidth(150); //设置第1列的宽度
table.getColumn(colname[1]).setPreferredWidth(140); //设置第2列的宽度
table.setBackground(new Color(244, 244, 242)); //设置表格背景
tb.setForeground(Color.GREEN); //设置表格颜色
tb.setFont(new Font("隶书",Font.PLAIN,14)); //设置表格字体
// 隐藏最后一列
table.getColumn(colname[colname.length - 1]).setMaxWidth(0);
table.getColumn(colname[colname.length - 1]).setMinWidth(0);
table.getColumn(colname[colname.length - 1]).setPreferredWidth(0);
//设置表格的自动调整模式
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
//设置表格的行选择模式
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//设置是否允许选择表格行
table.setRowSelectionAllowed(true);
//设置是否允许选择表格列
table.setColumnSelectionAllowed(true);
//设置是否允许同时存在行选择与列选择
table.setCellSelectionEnabled(true);
}
运行结果:
需要注意的是getColumn()方法是通过列名来获取对应列的TableColumn对象,当表格中有相同列名时只返回最先匹配列的TableColumn对象。你可以在列名前后加上空格用来区分。
Java表格的简单使用一的更多相关文章
-
使用 java 实现一个简单的 markdown 语法解析器
1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...
-
Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)
1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...
-
Java 异步处理简单实践
Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...
-
使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
-
Java中的简单工厂模式
举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...
-
Java之英格玛简单实现以及加密验证码的应用
最近看了一部电影<模仿游戏>,<模仿游戏>中艾伦·图灵破译英格玛让我对英格玛产生了好奇,于是就开始翻阅资料对其进行研究,但是毕竟智慧有限,所以我这里用Java实现一个简单的英格 ...
-
【JAVA零基础入门系列】Day12 Java类的简单应用
俗话说的好,实践出真知,所以除了理论知识掌握扎实以外,更重要的是要多加操练,这样才能掌握核心科技. 今天我们就用刚学会的类来实践一下,目标便是完成上一篇中的剁手任务. 我们的商品类已经准备好了,代码重 ...
-
java Socket实现简单在线聊天(二)
接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...
-
Java消息系统简单设计与实现
前言:由于导师在我的毕设项目里加了消息系统(本来想水水就过的..),没办法...来稍微研究研究吧..简单简单... 需求分析 我的毕设是一个博客系统,类似于简书这样的,所以消息系统也类似,在用户的消息 ...
随机推荐
-
MapRedue开发实例
一些例子,所用版本为hadoop 2.6.5 1.统计字数 数据格式如下(单词,频数,以tab分开): A 100 B 97 C 98A 98 package com.mr.test; import ...
-
Java设计模式之单例
一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...
-
Ubuntu Linux 12.04 LTS amd64系统本地root提权
URL:http://www.ichunqiu.com/section/173 由于fusermount二进制调用setuid的(geteuid())重置RUID时,它调用/bin/mount才能使用 ...
-
drupal前端开发的第一点
就是把admin/config/development/performance下面的选项全部去掉,方便作为一个匿名用户来访问,不用每次都drush cc all.
-
照着别人的demo自己试着做了个放大镜效果
原理: A:放大镜 B:小图片 C:大图片可视区域 D:大图片 鼠标的位置应该在放大镜的*,所以鼠标位置为:clientX=A.offsetLeft()+B.offsetLeft+1/2*A.o ...
-
如何起草你的第一篇科研论文——应该做&;避免做
如何起草你的第一篇科研论文——应该做&避免做 导语:1.本文是由Angel Borja博士所写.本文的原文链接在这里.感谢励德爱思唯尔科技的转载,和刘成林老师的转发.2.由于我第二次翻译,囿于 ...
-
java入门第四步之应用服务器的安装(Tomcat)【转】
首先打开myeclipse,在myeclipse菜单栏下面有两个按钮: 左边的按钮是进行项目的部署的(即将项目部署到服务器上),右边的按钮是进行服务器的启动的,如果你安装了tomcat服务器,那你就可 ...
-
JS中如何判断null、undefined与NaN
1.判断undefined: <span style="font-size: small;">var tmp = undefined; if (typeof(tmp) ...
-
ArrayList的add(E e)方法与扩容
ArrayList是Java开发中经常用到的集合类,它是List接口的实现类,具有很高的查询性能,但不是线程安全的.本文主要讲述了ArrayList的add(E e)方法及该方法中涉及到的容量扩容技术 ...
-
OJ:又一道考察多态的题目
Description 下面的程序输出结果是: A::Fun A::Do A::Fun C::Do 请填空: 程序代码如下 #include <iostream> using namesp ...