2

我正在尝试创建一个类似于以下模型的 JTable:

自定义 JTable

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

该表也是不可编辑或可选择的;它只是在更新时由用户查看。

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

我的问题如下:

  1. 有没有更干净的方法来做到这一点,而不会用标题中使用的这些静态值污染我的表模型?
  2. 我已经阅读了有关扩展表模型的信息,但我不确定应该扩展哪个类(DefaultTableModel、AbstractTableModel)以及应该覆盖哪些方法。
4

2 回答 2

6

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

还要考虑一个JScrollPane包含一个JPanel具有GridLayout和包含 22x22 个实例的实例JLabel,或者一个合适的子类。这很容易扩展到数千个单元。

附录:如果需要,CellRendererPane制作一个好的元渲染器,如此处所建议

如果您选择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
    }
    
于 2012-04-21T21:56:15.590 回答
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 ontopJTable仅使用TableHeader

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

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

(对 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);
    }
}

3) 否则请查看如何使用凸起的边框prepareRederer

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

于 2012-04-21T21:02:58.773 回答