在JTable中可变行高;比在隐藏表模型列中存储高度值更好的方法



我正在为JTable编写一个单元格渲染器,它允许每行具有不同的高度。对于表中的每一列,我都向表中添加了一个相邻的隐藏列,该列仅包含行高的int值。我认为这将是低效的,并在我实现更复杂的调整大小时带来问题。

是否有一种方法有一个静态列表初始化的主类,可以通过getTableCellRendererComponent访问?

下面是我目前正在做的一个独立的例子:

import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class variableRowHeightDemo extends JFrame {
    public variableRowHeightDemo() {
        JTable vr_table = new JTable();
        vr_table.setModel(new DefaultTableModel(
                new Object[][]{
                    {"Height: 30", 30},
                    {"Height: 60", 60},
                    {"Height: 90", 90},},
                new String[]{
                    "String", "int height value"
                }));
        vr_table.setDefaultRenderer(Object.class, new variableRowHeightRenderer());
        add(vr_table);
        pack();
    }
    static class variableRowHeightRenderer extends JTextField implements TableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int col) {
            // rows heights stored in second invis column
            int height = (int) table.getModel().getValueAt(row, 1);
            table.setRowHeight(row, height);
            this.setText(value.toString());
            return this;
        }
    }
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new variableRowHeightDemo().setVisible(true);
            }
        });
    }
}

基本上,我想将行高度存储在表模型之外,但我不确定如何从子类访问它们而不使行高度列表最终。此外,如果有任何明显的问题与我的执行,我会很感激听到他们。

谢谢,詹姆斯

table.setRowHeight(row, height);

那行代码不应该在渲染器中使用。您不应该在渲染中更改表的属性。您发布的代码将导致无限循环,因为渲染器改变高度,然后表重新绘制行…

基本上,我想将行高度存储在表模型之外,

使用table.setRowHeight()方法添加数据到模型时有什么问题?您可以同时更新表

最新更新