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

Ash*_*Ash 2 java swing jtable

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

自定义JTable

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

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

我知道这可以使用DefaultTableModel实现,其中自定义渲染用于行1,2 && cols 1,2并在设置和获取表值时添加+2(考虑用作标题的行和列).

我的问题如下:

  1. 有没有一种更简洁的方法来做这个而不用标题中使用的这些静态值污染我的表模型?
  2. 我已经阅读了关于扩展表模型但是我不确定应该扩展哪个类(DefaultTableModel,AbstractTableModel)以及我应该覆盖哪些方法.

tra*_*god 6

输入限制为20x20,因此包括22x22的标头.

还考虑JScrollPane包含JPanel具有GridLayout和包含22×22的实例JLabel,或合适的子类.这容易扩展到几千个细胞.

附录:如果需要,请按照此处的建议CellRendererPane制作一个好的flyweight渲染器.

如果您继续使用JTable渲染可伸缩性,

  1. 这不是滥用; 它正是TableModel打算如何使用.TableModel模拟任何你决定的矩形矩阵.JTable只是该模型的(有效渲染)视图.

  2. 我更喜欢AbstractTableModel,这里显示,因为Vector很少是理想的数据结构.使用任何容器使您的索引最方便.DefaultTableModel是方便的,并作为扩展的指南AbstractTableModel.特别是,你需要一个setValueAt().

    @Override
    public void setValueAt(Object aValue, int row, int col) {
        ... // update your data structure
        this.fireTableCellUpdated(row, col); // notify the view
    }
    
    Run Code Online (Sandbox Code Playgroud)


mKo*_*bel 5

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

1)如果可能的话 Columns

  • 调整

  • 重新排序

2)如果可能的话 Columns

  • 滤波

  • 排序

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

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

C.每一个都JPanel放在JScrollPane里面

d.如果你要更改行数或列数(或过滤/排序),那么你必须通知JPanelrezize JTable#getPreferredScrollableViewportSize()+ Dimensionfor ontop JTableonly withTableHeader

非常类似的方式(你需要的一切)

在此输入图像描述在此输入图像描述在此输入图像描述

(Rob的无尽荣誉)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

3),否则看如何使用超募国界prepareRederer

4)这个问题与类型无关 TableModel