a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 140|回复: 0

[专业语言] Java认证辅导之关于Java中JTable的用法

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证辅导之关于Java中JTable的用法/ \) d- e* }3 W) K
Listing A包含了一个简单示例的代码,这个示例会说明常用JTable的行为。用户能够更改JTable的布局、拖放它的栏,或者通过拖动标题的分隔线来改变其大小。0 ^8 m& m9 F! [% y0 H3 R
这些列被保存在一个String数组里:
+ ^5 C8 o9 l2 X0 y+ [- aString[] columnNames = {“Product”,“Number of Boxes”,“Price”};
( V# O* }0 o7 }$ F3 f1 _' j数据被初始化并保存在一个二维的对象数组里:
6 v: }' z/ A, x, }Object[][] data =
$ q1 |# n7 j7 c/ F+ x{7 e( p3 ]  {( F, I# @# f
{“Apples”, new Integer(5),“5.00”},: s# [0 X# ?7 Z( u0 A8 J
{“Oranges”, new Integer(3),“6.00”},, v& _- [+ n& [) q
{“Pears”, new Integer(2),“4.00”},
0 l8 M5 f8 l3 k. d3 H0 |( z4 }{“Grapes”, new Integer(3),“2.00”},
+ j2 P. d2 u1 z" Q};+ O* T' W6 {9 \1 G+ C) q2 K. F
JTable是使用data和columnNames构成的:# s% \% Q  b: G
JTable table = new JTable(data, columnNames);
8 ]: W9 {: V- t" J. r0 M' _查看JTable
# F% f( ]) W+ A! x' r& T  @JTable的高度和宽度按照下面的方法来设定:
" P2 d, T9 k3 Z" f7 ]table.setPreferredScrollableViewportSize(new Dimension(300, 80));
; z8 Z' M, d6 V; L2 U6 R7 U如果JTable的一个列或者JTable窗口自身的大小被重新确定,那么其他列会被相应的缩小或者放大,以适应新的窗口。使用setAutoResizeMode()方法就能够控制这种行为:
3 G; u6 I, l  Htable.setAutoResizeMode(int mode);" S( T( g" M( d4 ]4 c( m9 e
mode整数字段可能的值有:2 X* G/ R0 k+ G9 ~( Y' n& Z
AUTO_RESIZE_OFF" L% K  f$ q( G
AUTO_RESIZE_NEXT_COLUMN
, u$ u/ y) M$ eAUTO_RESIZE_SUBSEQUENT_COLUMNS7 P+ U+ ]" f' T2 z$ k& S
AUTO_RESIZE_LAST_COLUMN
$ `8 J" I6 R9 a8 s4 qAUTO_RESIZE_ALL_COLUMNS1 @  `( @2 a1 p
表格的缺省值9 _$ Z3 P' M5 q2 e- q$ q) ]
单元格内方格坐标线的缺省颜色是Color.gray。要更改这些方格坐标线的颜色,就要用到:
/ L$ S) |% R$ J: p* I. rtable.setGridColor(Color.black);' j9 C, a% A0 `1 N8 |; _: W( A6 x4 e- C
你可以用下面的方法来改变行的高度:
0 g" d9 z( u" C$ itable.setRowHeight(intpixelHeight);# ?) R) Y4 W& H5 T/ J
各个单元格的高度将等于行的高度减去行间的距离。
* @: q* i( ^3 w' i& R# B* \1 m* t% k8 H( `$ O

! J: p: {: g3 H+ B在缺省情况下,内容的前景颜色和背景颜色的选择都是由Swing的所见即所得的实现来确定的。你可以使用下面的方法来更改选择的颜色:, Z4 H8 ~2 i+ O" ^; n- g
table.setSelectionBackground(Color.black); table.setSelectionForeground(Color.white);, c$ d* _# i$ ~: |
你也可以隐藏单元格的方格坐标线,就像下面这样:; H' p. Z( D" C# @
table.setShowHorizontalLines(false);
# q7 D3 ?# [/ i! G& E" {1 etable.setShowVerticalLines(false);
6 z- a- j/ f/ s* G; P3 Q9 M3 e列的宽度
4 I# ^8 |. S6 C& m* l. x6 l! iJTable组件有几个控制表格特性的类和接口。TableColumn会不断追踪列的宽度,并负责列大小的调整,包括最大和最小宽度。: q" a+ g" Q# z0 f$ D# J
TableColumnModel管理着TableColumns的集合以及列的选择。要设置某个列的宽度,就要为表格列的模型设置一个参照。然后,取得想要的TableColumn并调用其setPreferredWidth()方法:" _% p+ n! u7 z) }8 r, J. I8 p
TableColumncolumn = table.getColumnModel().getColumn(0);
4 r, n2 ?9 C6 ^" ]8 r4 }# a4 ?column.setPreferredWidth(100);
7 ?' |) L- w8 ?4 j当用户拖放列的时候,列的索引并不会发生改变。getColumn(0)方法会一直返回正确的列,无论它出现在屏幕的哪个地方。+ s  T/ k% o  E6 A  c
标题: V5 Z$ U7 A" }: P" F! H
JtableHeader会处理JTable标题的显示。你可以细分JtableHeader以获得自定义的布局。例如,如果你的应用程序需要一个跨越多个列的标题,那么只用简单地细分JtableHeader并将它集成到你的JTable里就行了。: |' d0 }) C( n& y5 J% S
你可以通过为当前JTable的JtableHeader设置一个参照或者调用其setReorderingAllowed()方法,来指定标题的重新排序是否被允许:4 \4 D* d6 o; G8 D
table.getTableHeader().setReorderingAllowed(false);3 @. G+ ~6 \6 W9 [  x! A; X5 ]
类似地,你可以确信列不会因为在列标题之间拖动而改变大小。要达到这个目的,你就要使用set ResizingAllowed()方法:3 \" \% R) r. O( Q
table.getTableHeader().setResizingAllowed(false);! M0 s! f9 j2 O2 G: u$ H7 Q1 j
选择模式+ d3 r" N! H( r( [- x: s
在缺省状况下,当用户在JTable里选择一个单元格的时候,整个行都被选中了。有多种方法能够让用户自定义选择的方式。利用ListSelectionModel接口,你可以允许用户选择单个或者多个行:( G3 Q' U3 F0 F+ N5 ?9 [# Y' b4 r
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);# U& M6 o) V* c+ y5 ^9 }
ListSelectionModel有下面这些字段:
, o3 G& I' Y- \, K0 s! e" R, ~SINGLE_SELECTION允许一次选择一行。
  ^  X8 U! A! V4 d4 gSINGLE_INTERVAL_SELECTION允许选择相邻的一系列行。' W; Z1 A0 P7 z3 K$ Q, [  N% r1 _1 n
MULTIPLE_INTERVAL_SELECTION也允许选择相邻的列,但是带有扩展功能。它允许用户使用[Ctrl]键进行多个互不相邻的选择(即选择不相邻的行)。
* G: {& f, [4 N0 N& V2 M9 TsetCellSelectionEnabled()方法让用户能够同时选择单个单元格或者整个行:2 }9 P4 P  u0 U8 G0 G8 n1 E
table.setCellSelectionEnabled(true);
) l8 }* g$ s, `) k7 n) [如果被设置为是,setCellSelectionEnabled()方法还会允许在选择行和单个单元格的同时选择列。
, X1 J: Y0 i$ C6 H5 S0 F- |) i4 p# W2 X' H
" Y' a$ n) M+ p" M( L  P! t
编辑单元格; }0 t5 U  c1 P0 g3 \
我们这个简单的表格允许用户编辑表格里的任何单元格。Listing B列出了一个表格,它允许由程序员来决定哪些单元格能够被编辑。第一步是创建一个自定义的TableModel:
4 d6 Y7 w* I+ _; }0 y+ U0 C4 J# Xclass SimpleTableModel extends AbstractTableModel {}
  h9 L& F9 q' `$ k. z; l3 S3 d数据被封装在TableModel里,当JTable初始化的时候,自定义的TableModel就被作为一个参数传递给JTable的构造函数而不是那个二维的对象数组:
1 _# X$ ~/ R/ C2 ?# ESimpleTableModelmyModel = new SimpleTableModel();! h. ^0 L. t! X- v% E9 o" `
JTable table = new JTable(myModel);  d% C% t3 P! m+ ]9 I
如果想让第二列和第三列也变得可以编辑,并把第一列变成恒定的,那么你就要强制替代TableModel的isCellEditable()方法:; C9 {7 }/ W6 O8 w+ H
public booleanisCellEditable(int row, intcol){+ O+ h) J2 z$ p3 y$ V& ~
if (col == 0) {return false;}- ^/ p: P8 V* M0 q9 T8 g
else {return true; }
0 P; T* G$ K/ R0 T0 p! ~}9 V6 g* H7 k! L  T9 @* T
简单的表格验证
0 k; d8 K' Z  U3 E& _4 D4 u你需要确保用户只输入整数值,假如说,向第二列(“盒子的数量”这一列)输入值来强制替代setValueAt()方法,并将验证逻辑包括进这个新方法里。首先,你要检查列是否是整数,以及这个列是否只应该包含整数值:
: Z9 T6 X; m+ X+ vif (data[0][col] instanceof Integer && !(value instanceof Integer))" L! b/ |0 e/ l$ n$ @8 _7 v
{… } else { data[row][col] = value;}
6 K' D) ~6 {$ h+ m* k8 W: |" P5 E然后,检查被插入的值是否是个整数。如果它不是的,那么这个字段就不应该被更新,而且应该要显示一条错误信息:8 J, x3 d. z* f' L8 N& d( Y5 N7 l7 H
try {) H% Q5 S  M% l2 L' I- t: u
data[row][col] = new Integer(value.toString());
  ~4 r. s7 j4 Z% U- L! y5 ?9 R+ [} catch (NumberFormatException e) {2 H; U. L9 ]( X! l- F
JOptionPane.showMessageDialog(SimpleTable.this,
" Y4 o( t! \  R  i" o) v, d% T/ D“Please enter only integer values.”);
$ j' R9 E# n7 b8 f, n6 w' _3 A背景颜色0 H0 F5 C, ^! ^( k5 u( ~
Listing C包含了用于ColorTable.java的代码,它说明了如何向JTable加入颜色。你可以通过强制替代其prepareRenderer()方法来向JTable加入背景颜色:# p4 X; r. S$ r
JTable table = new JTable(data, columnNames){
1 R* g: P) N( C+ |" U& w  F' rpublic Component prepareRenderer(TableCellRenderer r, int row, intcol){}
2 ?: ^6 L* [4 O/ q" r" r& w};
) n% q% ?5 T) t, g5 _然后,插入决定哪些列应该有颜色以及应该是什么颜色的逻辑:
/ J2 A& Q7 _# m4 n. Uif (col == 2 && !isCellSelected(row, col)){
. S! _. G6 n+ zColor bg = new Color(200, 100, 30);
/ J  M0 e2 G" Fc.setBackground(bg);* ~' }/ s3 G# o$ {
c.setForeground(Color.white);
) L, _0 G9 X5 W3 O. e}要注意,当你更改单元格背景颜色的时候,你还应该更该单元格里所显示的文本的颜色,让其变得更加易读。图C显示了一个第一列和第二列加上了颜色的JTable。8 {) Y7 b5 F, l+ X; J$ V# Y; C

5 p9 y8 D: F8 H3 _
, _; m; t, o2 x4 c. r4 k! r一切皆在掌握中
& t/ c, v/ E4 |1 v% s7 q7 n5 L我们的例子只是JTable其他部分的基础。通过使用这些工具,你能够快速和轻易地掌控对Java应用程序所生成的表格的格式化,这样就能够让你的用户在进行正常使用的时候不碰到障碍。
' y8 J3 h% x1 F. m  ?----------------------------------------------------------------------------------------------------------------------------------
% Y( c6 H6 B7 mimport java.awt.Dimension;3 g$ O! ?/ c4 U/ n( E0 @
import javax.swing.JFrame;
) }( ^( i- ]6 v# G( pimport javax.swing.JScrollPane;
+ b% s7 p) d$ H! Q( r3 ?import javax.swing.JPanel;
; u2 [; Y7 q; k9 l" oimport javax.swing.JTable;5 E0 M: C7 a# o* I' C* z
import java.awt.Color;& @4 M3 t7 Z& d* C9 ]
import java.awt.GridLayout;
4 y7 M, y. I8 j  J# @- v$ Jimport javax.swing.table.TableColumn;
8 ?- `9 z, p+ O) }public class JTableDemo
/ n) ]# L$ K, i4 v, T{
6 ]( @' B/ t5 z# P: g6 {4 s+ Ypublic static void main (String[] args)
3 `( T7 G7 o1 W) n. R" t{
- M  z8 L: t3 ^+ z" r0 ~. k4 l/*" M% ^; p2 b: e( }* U* R7 \6 J9 X; `
构造函数有很多下面先介绍几个:# x$ D- u5 j% H% d2 R3 [7 M. S
JTable()( R3 T0 p3 H/ o- ?" K) Y# I# a' X+ h
JTable(int numRows, int numColumns)
9 L* h0 m6 Y! K# T  q) v" d6 F9 PJTable(Object[][] rowData, Object[] columnNames)
  t1 d3 w5 A; K$ j! P*/+ g" V6 Z: t+ V7 V' I
JTable example1 = new JTable ();//看不到但存在) x, A- O0 {$ V1 g6 p* E& n
JTable example2 = new JTable (8, 6);
! z8 i" u4 j+ D; s; s0 Q" zfinal Object[] columnNames = {“姓名”, “性别”, “家庭地址”,//列名最好用final修饰1 l9 H- }5 U& n" O2 D! o
“电话号码”, “生日”, “工作”, “收入”, “婚姻状况”,“恋爱状况”};: ?9 d' Q! U3 F4 [
Object[][] rowData = {
5 o( d8 J' `8 p, v" e+ m( S{“ddd”, “男”, “江苏南京”, “1378313210”, “03/24/1985”, “学生”, “寄生中”, “未婚”, “没”},$ _2 Z* q& {% A4 R9 B
{“eee”, “女”, “江苏南京”, “13645181705”, “xx/xx/1985”, “家教”, “未知”, “未婚”, “好象没”},
! L* h* o: {5 @! `{“fff”, “男”, “江苏南京”, “13585331486”, “12/08/1985”, “汽车推销员”, “不确定”, “未婚”, “有”},
8 h3 _1 T3 u. B{“ggg”, “女”, “江苏南京”, “81513779”, “xx/xx/1986”, “宾馆服务员”, “确定但未知”, “未婚”, “有”},
8 t$ {2 d- X0 C) W) M1 y$ Z{“hhh”, “男”, “江苏南京”, “13651545936”, “xx/xx/1985”, “学生”, “流放中”, “未婚”, “无数次分手后没有”}
  Z0 }$ l" C* G0 s$ _$ `6 R};, I# F8 t$ e1 i, D+ B) P9 Z5 f& b
: t2 x/ a- `  @

4 L0 A8 E/ `/ x0 GJTable friends = new JTable (rowData, columnNames);
- |- \7 C! n! {! p6 X6 }9 Lfriends.setPreferredScrollableViewportSize(new Dimension(600, 100));//设置表格的大小' Y# L. J1 h5 w1 a6 \
friends.setRowHeight (30);//设置每行的高度为20; \  x/ `/ K9 \, j* K/ Y: Z# Z# Q
friends.setRowHeight (0, 20);//设置第1行的高度为156 L' J2 \' k6 Y
friends.setRowMargin (5);//设置相邻两行单元格的距离2 z$ \* N4 ~$ D1 X- ?3 a( X
friends.setRowSelectionAllowed (true);//设置可否被选择。默认为false
* K. @* Y' b3 h) n' gfriends.setSelectionBackground (Color.white);//设置所选择行的背景色$ u8 u  B# X  {6 w$ x
friends.setSelectionForeground (Color.red);//设置所选择行的前景色' V: @" u+ i& h& W1 X# n
friends.setGridColor (Color.black);//设置网格线的颜色
1 d! E5 E! F- e; ^5 }" |friends.selectAll ();//选择所有行+ [& y7 T1 |  E) k& g/ ?8 B
friends.setRowSelectionInterval (0,2);//设置初始的选择行,这里是1到3行都处于选择状态4 a) k. a9 D: n, \3 K1 j
friends.clearSelection ();//取消选择" t% t1 E' H7 U% Y
friends.setDragEnabled (false);//不懂这个
1 H) |' A6 k! P9 `( Ffriends.setShowGrid (false);//是否显示网格线
4 n7 R8 k( M7 h( s) Rfriends.setShowHorizontalLines (false);//是否显示水平的网格线
" o; ^) Z2 w4 x! afriends.setShowVerticalLines (true);//是否显示垂直的网格线: f1 W8 m: f1 F* V! i
friends.setValueAt (“tt”, 0, 0);//设置某个单元格的值,这个值是一个对象' S( }! x) D- Z& r) A
friends.doLayout ();: \% @: \8 @4 K! u6 l( ^1 q' _
friends.setBackground (Color.lightGray);
3 Z) ]) o0 [- A: G/ i) UJScrollPane pane1 = new JScrollPane (example1);//JTable最好加在JScrollPane上
" @3 G; O5 B5 G+ j, pJScrollPane pane2 = new JScrollPane (example2);
  |6 `$ }: a3 L8 pJScrollPane pane3 = new JScrollPane (friends);9 p, D, P8 u2 G4 _" a- [3 u7 V7 K
JPanel panel = new JPanel (new GridLayout (0, 1));
  z! _4 v6 t+ y3 U6 M' [panel.setPreferredSize (new Dimension (600,400));; J$ K% ?0 x, T$ o2 [' P: p% ?
panel.setBackground (Color.black);: t- g& l9 r& g- p  \
panel.add (pane1);7 Z2 F$ {0 M6 Q/ C. n/ l( N
panel.add (pane2);& ]. l$ m! |% Z( y& \
panel.add (pane3);
: D. J4 p- m1 e: @1 OJFrame frame = new JFrame (“JTableDemo”);
6 k+ o! G$ H( Tframe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);" ^& W1 {8 R9 b7 o* n  n5 c
frame.setContentPane (panel);
* n; v. k5 z7 eframe.pack();
9 H! C# S; p3 s" ~frame.show();' _5 j- P* Q; F+ M. e
};
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-10 18:16 , Processed in 0.226080 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表