创建具有多个列标题和行标题的自定义TableModel

时间:2012-04-21 20:00:52

标签: java swing jtable

我正在尝试创建一个看起来像下面的模型的JTable:

custom JTable

绿色角基本上是红色列和行标题的缓冲空间。单元格不需要以图中的颜色渲染;但是,它们需要与表中其他“白色”细胞区分开来。

此表也不可编辑或可选择;它只是在用户更新时才被用户查看。

我知道这可以使用DefaultTableModel实现,并为行1,2和& cols 1,2并在设置和获取表值时添加+2(计算用作标题的行和列)。

我的问题如下:

  1. 是否有一种更简洁的方法来执行此操作而不会使用标头中使用的这些静态值来污染我的表模型?
  2. 我读过有关扩展表模型但我不确定应该扩展哪个类(DefaultTableModel,AbstractTableModel)以及我应该覆盖哪些方法。

2 个答案:

答案 0 :(得分:6)

  

输入限制为20x20,因此包括标题为22x22。

另请考虑JScrollPane JPanel包含GridLayout JLabel且包含22x22个实例CellRendererPane或合适的子类。这很容易扩展到数千个细胞。

附录:如果需要,JTable按照建议flyweight制作一个好的here渲染器。

如果您使用TableModel来提升可扩展性,

  1. 这不是滥用;这正是TableModel的意图。 JTable模拟您决定的矩形矩阵。 AbstractTableModel只是该模型的一个(有效渲染)视图。

  2. 我更喜欢显示hereVector,因为DefaultTableModel很少是所需的数据结构。使用任何容器使您的索引最方便。 AbstractTableModel非常方便,可作为扩展setValueAt()的指南。特别是,您需要@Override public void setValueAt(Object aValue, int row, int col) { ... // update your data structure this.fireTableCellUpdated(row, col); // notify the view }

    {{1}}

答案 1 :(得分:5)

更长的评论,一切都取决于

1)如果可以Columns

  • 调整

  • 重新排序

2)如果可以Columns

  • 过滤

  • 排序

一个。然后你看看两个JTable,第一个JTable只有TableHeader,简单的删除行和第二个完整大小的JTable与TableHeader和列和行,

湾对于两个JTableHeader之间的交互是有的 TableColumnModelListener#columnMarginChanged(ChangeEvent e)columnMoved(TableColumnModelEvent e)

℃。每一个都放在JScrollPane内的JPanel

d。如果您要更改行数或列数(或过滤/排序),则必须通过JPanel通知JTable#getPreferredScrollableViewportSize()Dimension + JTable on TableHeader import java.awt.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; public class TableFilterRow extends JFrame implements TableColumnModelListener { private static final long serialVersionUID = 1L; private JTable table; private JPanel filterRow; public TableFilterRow() { table = new JTable(3, 5); table.setPreferredScrollableViewportSize(table.getPreferredSize()); JScrollPane scrollPane = new JScrollPane(table); getContentPane().add(scrollPane); table.getColumnModel().addColumnModelListener(this); // Panel for text fields filterRow = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0)); for (int i = 0; i < table.getColumnCount(); i++) { filterRow.add(new JTextField(" Sum at - " + i)); } columnMarginChanged(new ChangeEvent(table.getColumnModel())); getContentPane().add(filterRow, BorderLayout.SOUTH); } // Implement TableColumnModelListener methods // (Note: instead of implementing a listener you should be able to // override the columnMarginChanged and columMoved methods of JTable) @Override public void columnMarginChanged(ChangeEvent e) { TableColumnModel tcm = table.getColumnModel(); int columns = tcm.getColumnCount(); for (int i = 0; i < columns; i++) { JTextField textField = (JTextField) filterRow.getComponent(i); Dimension d = textField.getPreferredSize(); d.width = tcm.getColumn(i).getWidth(); textField.setPreferredSize(d); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { filterRow.revalidate(); } }); } @Override public void columnMoved(TableColumnModelEvent e) { Component moved = filterRow.getComponent(e.getFromIndex()); filterRow.remove(e.getFromIndex()); filterRow.add(moved, e.getToIndex()); filterRow.validate(); } @Override public void columnAdded(TableColumnModelEvent e) { } @Override public void columnRemoved(TableColumnModelEvent e) { } @Override public void columnSelectionChanged(ListSelectionEvent e) { } public static void main(String[] args) { JFrame frame = new TableFilterRow(); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } 1}}

非常类似于那里(你需要的一切)

enter image description here enter image description here enter image description here

(Rob的无尽荣誉)

prepareRederer

3)否则在TableModel

中查看How to Use Raised Borders

4)此问题与{{1}}

的类型无关