乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > <em>Java</em> jtable表头实现有一个下拉列表框,然后可以通过...-java

<em>Java</em> jtable表头实现有一个下拉列表框,然后可以通过...-java

作者:乔山办公网日期:

返回目录:excel表格制作


Swing JTable 有一个东西叫 Table Model,它在编辑和显示时是这样工作:

1,当表格要显示前,它会依次询问每一行每一列e69da5e6ba90e799bee5baa6e79fa5e98193366,你的 getCellRenderer 是什么,对于一般的字符串,我们回答 JLabel,这也是默认的。我们可以提供自已的 TableCellRenderer 来告诉 JTable 这个格子显示成 Checkbox 或下拉框。

2,当我们单击某个格子或键盘移动焦点到某个格子,JTable 会询问,这个格子 (x, y) 是否支持编辑?我们需要在 getTableCellEditor().isCellEditable() 中回答是或否,当否时,JTable 什么也不做,当回答是时,JTable 会接着询问,getTableCellEditor().getTableCellEditorComponent(...) 是什么,默认时它是一个 JTextField,当然我们可以回答它是一个 JCheckBox 或 JComboBox 来告诉 JTable 我们有一个自定义的编辑器。


在准备显示值时都会从 Table Model 中把值交给当前的 Cell Renderer 或 Cell Editor,当用户按确定或鼠标移走导致焦点丢失时需要验证这个正在编辑的值是否正确合法(我们基于业务规则来验证,比如是否是个数字)并在正确时 commit 回 Table Mode (commit 过程本身我们不需要操作,只需要告诉 JTable true 或 false),验证失败时直接丢弃这个编辑值。


我们提供一个自己的 TableCellRenderer 和 TableCellEditor 然后在每一个方法里面打印一下内容来观察它的工作过程和调用次序。然后我们给出自己的实现方法。


基于上面的了解,你这个问题,只需要在询问第一列是否可以编辑时统统回答No,然后自己自动生成这一列的值。至于其它的你不需要特别的 Cell Editor ,你只需要继承一个默认的 DefaultCellEditor,它只需要回答对第一列不可编辑就可,其它方法统统不要覆盖,直接使用继承来的。创建 JTable 时设置这个 Cell Editor. 如果你希望第一列的背景色略有不同那你得用一个不同的 Cell Renderer,继承自 JLabel,但当是第一列时就给它改一下 JLabel 的背景颜色,其它不变地继承使用继承来的方法不要覆盖掉,同样是创建 JTable 后就设置 Cell Renderer。


记得因为第一列在 JTable 看来是数据,当在我们概念上看来不是数据,因此我们需要注意列号偏移了一位,比如我们在 Vector [ Vector] 这个二组的数组中用 0 列表示第一列,从#1列开始才是数据。


看看我写的一个 MyCellRenderer,它添加一个分隔符在其中,可以拖动,只是这个 UI 难看了点。

package com.ts.ui.util;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.util.EventObject;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

import sun.swing.table.DefaultTableCellHeaderRenderer;

public class CLTreeTable extends JTable {
private static final int SEPARATOR = 2;

class MyCellRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {

if (column == SEPARATOR) {
JButton renderer = new JButton();
renderer.setBorder(new MyBorder(renderer.getBorder()));
return renderer;
} else {
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
}
}

class MyHeaderRenderer extends DefaultTableCellHeaderRenderer {

public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {

if (column == SEPARATOR) {
JButton renderer = new JButton();
renderer.setBorder(new MyBorder(renderer.getBorder()));
return renderer;

} else {
return super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
}
}

public void paintComponent(Graphics graphic) {

super.paintComponent(graphic);
}

}

class MyCellEditor extends DefaultCellEditor {

public MyCellEditor(JTextField textField) {
super(textField);
}

public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
MouseEvent event = (MouseEvent) anEvent;
int column = CLTreeTable.this.columnAtPoint(event.getPoint());
if (column == SEPARATOR) {
return false;
}
}

return super.isCellEditable(anEvent);
}

}

class MyBorder implements Border {
private Border delegate;

MyBorder(Border delegate) {
this.delegate = delegate;
}

public void paintBorder(Component c, Graphics g, int x, int y,
int width, int height) {

this.delegate.paintBorder(c, g, x, y, width, height);
}

public Insets getBorderInsets(Component c) {
return new Insets(0, 1, 0, 1);
}

public boolean isBorderOpaque() {
return this.delegate.isBorderOpaque();
}

}

public CLTreeTable(Object[][] data, Object[] header) {
super(data, header);

super.setDefaultRenderer(Object.class, new MyCellRenderer());
super.setDefaultEditor(Object.class, new MyCellEditor(new JTextField()));
super.getTableHeader().setDefaultRenderer(new MyHeaderRenderer());

if (header.length > SEPARATOR) {
TableColumnModel model = super.getColumnModel();
TableColumn column = model.getColumn(SEPARATOR);

column.setMaxWidth(16); // Swing's default minimum width;
}
}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

String[][] data = new String[][] {
{ "A1", "B1", "", "C1", "D1", "E1" },
{ "A2", "B2", "", "C2", "D2", "E2" } };
String[] header = new String[] { "A", "B", "", "C", "D", "E" };

JScrollPane box = new JScrollPane(new CLTreeTable(data, header));

frame.getContentPane().add(box);
frame.setBounds(100, 100, 400, 400);

frame.setTitle("My CL Tree Table");

frame.setVisible(true);
}
}






JTable 有很多用e79fa5e98193e78988e69d83333来自定义其呈现和编辑的工具,同时提供了这些功能的默认设置,从而可以轻松地设置简单表。例如,要设置一个 10 行 10 列的表: TableModel dataModel = new AbstractTableModel() { public int getColumnCount() { return 10; } public int getRowCount() { return 10;} public Object getValueAt(int row, int col) { return new Integer(row*col); } }; JTable table = new JTable(dataModel); JScrollPane scrollpane = new JScrollPane(table); 注意,如果要在单独的视图中(在 JScrollPane 外)使用 JTable 并显示表标题,则可以使用 getTableHeader() 获取并单独显示它。 要启用行的排序和过滤,请使用 RowSorter。可以通过以下两种方式之一设置一个行排序器。 直接设置 RowSorter。例如:table.setRowSorter(new TableRowSorter(model))。
将 autoCreateRowSorter 属性设置为 true,从而 JTable 可用于创建 RowSorter。例如:setAutoCreateRowSorter(true)。
设计使用 JTable 的应用程序时,务必要注意用来表示表数据的数据结构。DefaultTableModel 是一个模型实现,它使用一个 Vector 来存储所有单元格的值,该 Vector 由包含多个 Object 的 Vector 组成。除了将数据从应用程序复制到 DefaultTableModel 中之外,还可以用 TableModel 接口的方法来包装数据,这样可将数据直接传递到 JTable,如上例所示。这通常可以提高应用程序的效率,因为模型可以自由选择最适合数据的内部表示形式。在决定使用 AbstractTableModel 还是使用 DefaultTableModel 方面有一个好的实践经验,即在创建子类时使用 AbstractTableModel 作为基类,在不需要创建子类时则使用 DefaultTableModel。 源分布演示部分中的 "TableExample" 目录给出了许多 JTable 用法的完整示例,包括如何使用 JTable 来提供一个可编辑的数据视图(数据取自数据库),以及如何修改显示的列以使用指定的渲染器和编辑器。 JTable 使用专有的整数来引用它所显示的模型的行和列。JTable 采用表格的单元格范围,并在绘制时使用 getValueAt(int, int) 从模型中获取值。务必记住各种 JTable 方法所返回的列和行索引是就 JTable(视图)而言的,不一定是模型所使用的那些索引。 默认情况下,在 JTable 中对列进行重新安排,这样在视图中列的出现顺序与模型中列的顺序不同。但这根本不影响模型的实现:当列重新排列时,JTable 在内部保持列的新顺序,并在查询模型前转换其列索引。 因此编写 TableModel 时,不必侦听列的重排事件,因为不管视图怎样,模型都将在其自己的坐标系统被查询。在示例部分中有一个排序算法的演示,此演示正是使用了此技术在另一个坐标系统中进行排序,其中更改了行顺序,没有更改列顺序。 类似地,使用 RowSorter 提供的排序和过滤功能时,底层 TableModel 不需要知道怎样进行排序,RowSorter 将处理它。对底层 TableModel 使用 JTable 的基于行的方法时,必须进行坐标转换。所有基于 JTable 行的方法都是就 RowSorter 而言的,不一定与底层 TableModel 的方法相同。例如,选择始终是就 JTable 而言的,因此使用 RowSorter 时,需要使用 convertRowIndexToView 或 convertRowIndexToModel 进行转换。以下代码显示了如何将 JTable 的坐标转换为底层模型的坐标
楼主,具体的render是如何写的。。。。。。

你上面是getColumnName那有三个列名相同喔,这zd样应该可以的了

table.getColumnModel().getColumn(0).setCellRenderer(render);

用java的JTable实现类似Excel的报表控件主要需要完成的工作如下:
1. 单元格合并与拆分。
2. 基于JTextArea的渲染器,用来实现多行输入。
3. 由于采用JTextArea作为渲染器,导致文本只能向左对齐,后来通过重载JTextArea得以实现居中,居右,字体下划线等效果:)。
4. 鼠标动态拉行高,拉行宽。
5. 发现行数一多,导致性能下降很历害,所以实现了只刷新当前可视屏幕区域。
6. 单元格属性的设定:背景颜色、前景颜色、字体(大小,粗斜体,下划线,删除线)、对角线单元格(中国式报表)、边框线等
7. 打印预览
8. 打印
9. 自己实现的7a686964616fe78988e69d83333打印设置对话框(打印水印、打印方向、纸张页边距、打印纸张页数范围、打印顺序、设定打印的页眉和页脚、放大打印或缩小打印)
10.往单元格加载图片,可预览和打印出来
11.套打模式,在table显示标尺,并重置行高为1cm,行宽为2cm,以方便使用者对应套打纸张
12.为单元格绘制边线
13.查找和替换
14.增加行和列,删除行和列
15.格式刷
16.排序,升和降。可设定优先排序的形式,数值优先或着是中文优先,中文按照拼音排序
17.考贝,复制和贴粘
18.插入图表,目前只实现了柱状图表
19.求和
20.各种热键组合
21.显示和隐藏table网格线
Java实现jtable 表头实现类似Excel筛选功能,你可以采取以上步骤进行总结,希望你早日得到答案。

相关阅读

  • -excel2013表头,excel表头怎么做

  • 乔山办公网excel表格制作
  • 1、首先打开文档,点击菜单栏的“文件”知——“页面设置”。2、在打开的页面设置对话框中,切换到“道工作表”选项卡,并把光标定位到“顶端标题行”。3、然后选择你要专每页
关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网