为JTable加上Row Header.
来源:互联网 发布:淘宝客哪里找 编辑:程序博客网 时间:2024/05/29 19:34
1.什么是Row Header?
先来了解什么是Column Header. 打开Excel, 位于表格列上方,标有A,B,C,D...的地方就叫Column Header. 那Row Header就是左方标有行号的地方了.
2.为什么要为JTable加Row Header?
Swing中的JTable提供了强大的表格处理能力, 但只提供了Column Header功能,却没有直接提供加Row Header功能.
3.如何实现?
要想为JTable加上Row Header或Column Header, 要先将JTable放入一个JScrollPane. 我们先来看看JScrollPane的结构:
如图所示,JScrollPane有9个部分组成,我们可以用JScrollPane的以下这些方法,为这9个区域加上不同的组件:
setColumnHeaderView(Component view)
setCorner(String key, Component corner)
setHorizontalScrollBar(JScrollBar horizontalScrollBar)
setRowHeaderView(Component view)
setVerticalScrollBar(JScrollBar verticalScrollBar)
setViewportView(Component view)
其中有些方法的参数是Component,而几乎所有的swing组件都是由Component继承而来的,也就是说,我们可以为这些区域加上任意的swing组件.
再看如下代码:
public class ScrollableTable extends JFrame
{
public ScrollableTable()
{
JScrollPane scrollPane = new JScrollPane(new JTable(10,10));
this.getContentPane().add(scrollPane);
}
}
这个类将一个10*10单元格大小的Table加入了JScrollPane中,即图中的JViewPort的位置放置JTable,并且自动会为JTable加上Column Header,这个是Swing为我们自动完成的,我们只告诉它JTable加入了JScrollPane,ColumnHeader是它自动加上的.
要想为JTable加上Row Header实际上是为JScrollPane的Row Header区域加上一个类似于Row Header的东东.那什么组件最适于充当Row Header呢? 还是JTable! 对.我们再放一个JTable在JScrollPane的Row Header区域,让其行数与JViewPort中的JTable一样,并显示每一行的行号.如下:
DefaultTableModel model = new DefaultTableModel(50,10);
DefaultTableModel Rowheadmodel = new DefaultTableModel(50,10);
JTable table = new JTable(model);
JTable RowHeaderTable = new JTable(Rowheadmodel);
Rowheadmodel.setColumnCount(1);
Rowheadmodel.setColumnIdentifiers(new Object[]{""});
RowHeaderTable.setEnabled(false);
RowHeaderTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
RowHeaderTable.getColumnModel().getColumn(0).setPreferredWidth(50);
/*为RowHeaderTable设置预设的绘制器*/
RowHeaderTable.setDefaultRenderer(RowHeaderTable.getColumnClass(0),new RowHeaderRenderer(table));
RowHeaderTable.setPreferredScrollableViewportSize (
new Dimension
(
RowHeaderTable.getColumnModel().getColumn(0).getPreferredWidth()
,0
)
);
/*将table加入JScrollPane*/
JScrollPane scrollPane = new JScrollPane(table);
/*将RowHeaderTable作为Row Header加入JScrollPane的RowHeaderView区域*/
scrollPane.setRowHeaderView(RowHeaderTable);
this.getContentPane().add(scrollPane);
大家发现没有,在代码中有一个RowHeaderRenderer类(标为蓝色字体的),这个类是做什么的呢? 为了实现在table中新增、删除行时,RowHeaderTable的行数与行号一起变化,也为了Row Header看起来更像Header,我们实现了一个TableCellRenderer,用JLabel作为单元格的绘制器,并用:
public class RowHeaderRenderer extends JLabel implements TableCellRenderer
{
JTable reftable;
public RowHeaderRenderer(JTable reftable)
{
this.reftable = reftable;
}
public Component getTableCellRendererComponent(JTable table,
Object obj,
boolean isSelected,
boolean hasFocus,
int Row, int col)
{
((DefaultTableModel)table.getModel()).setRowCount(reftable.getRowCount());
JTableHeader Header = reftable.getTableHeader();
this.setOpaque(true);
/*设为TableHeader的边框类型*/
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(CENTER);
/*设置背景色为TableHeader的背景色*/
setBackground(Header.getBackground());
Font font = Header.getFont();
if ( isSelect(Row) ) /* 当选取单元格时,在Row Header上设置成选取颜色 */
{
setForeground(Color.white);
setBackground(Color.lightGray);
setFont(font);
setText(String.valueOf(Row+1));
}
else
{
setForeground(Header.getForeground());
setFont(font);
setText(String.valueOf(Row+1));
}
return this;
}
private boolean isSelect(int Row)
{
int[] sel = reftable.getSelectedRows();
for ( int i=0; i<sel.length; i++ )
{
if (sel[i] == Row ) return true;
}
return false;
}
}
- 为JTable加上Row Header.
- 为JTable加上Row Header.
- Row Header
- 联网请求统一加上header
- 为JTable添加RowHeader
- 为JTable添加button
- Repeat Tablix Row Header on each page
- [Web API]以Attribute加上Header验证
- JTable表头排序后,row获取错乱的问题解决
- 为网站加上图标
- Showing JTable Header Without Using JScrollPane java中的JTable不显示表头的原因
- 为ListView增加Header
- 为ListView增加Header
- 为vsftpd加上ssl支持
- 为gridview 加上删除 按钮
- aspjpeg为图片加上水印
- 如何为datagridview加上序号
- 为Hmtl页面加上scrollbar
- 记录两个dos命令
- 一个简单的 Web Server(build 2002-8-20)
- 使用JBuilder来制作EXE文件(白云原创)
- SQL SERVER 数据导出EXCEL 的存储过程
- ActiveReport Web Application 事前准备
- 为JTable加上Row Header.
- 教写商业计划书 - 奇虎董事长周鸿祎
- Cocoa处理消息的方法:Delegate
- 在Java程序,如何实现自适应位置的快捷菜单
- VS2005+wxWidget 配置
- 轻松使用集线器组对等网常识
- 在Java MDI窗口中加入滚动条
- java版本的escape和unescape函数
- 现在开始研究DNN