Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建具有多个列标题和行标题的自定义TableModel_Java_Swing_Jtable - Fatal编程技术网

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

Java 创建具有多个列标题和行标题的自定义TableModel,java,swing,jtable,Java,Swing,Jtable,我正在尝试创建一个JTable,它看起来像下面的模型: 绿色角落基本上是红色列和行标题的缓冲区空间。细胞不需要渲染成图中的颜色;但是,它们需要与表中的其他“白色”细胞区分开来 此表也不可编辑或选择;它只是在更新时由用户查看 我知道这可以通过使用DefaultTableModel来实现,该模型具有行1,2&&cols 1,2的自定义呈现,并在设置和获取表值时添加+2(考虑用作标题的行和列) 我的问题如下: 有没有一种更干净的方法可以做到这一点,而不用在标题中使用这些静态值来污染我的表模型 我读过

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

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

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

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

我的问题如下:
  • 有没有一种更干净的方法可以做到这一点,而不用在标题中使用这些静态值来污染我的表模型
  • 我读过关于扩展表模型的内容,但我不确定应该扩展哪个类(DefaultTableModel、AbstractTableModel)以及应该覆盖哪些方法

  • 更多的评论,一切取决于你

    1) 如果
    列有可能

    • 调整大小

    • 重新排序

    2) 如果
    列有可能

    • 过滤

    • 分类

    a。然后您将看到两个JTable,第一个JTable仅包含TableHeader,简单包含删除的行,第二个完整大小的JTable包含TableHeader、列和行

    b。两个JTableHeader之间的交互是否存在
    columnMoved(TableColumnModelEvent e)

    c。每次在JScrollPane中放入一个
    JPanel

    d。如果要更改行数或列数(或过滤/排序),则必须通知
    JPanel
    以获取rezize
    JTable\getPreferredScrollableViewportSize()
    +
    维度
    以获取ontop
    JTable
    仅使用
    表格标题

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

    (对罗布的无限赞誉)

    import java.awt.*;
    导入javax.swing.*;
    导入javax.swing.event.*;
    导入javax.swing.table.*;
    公共类TableFilterRow扩展JFrame实现TableColumnModelListener{
    私有静态最终长serialVersionUID=1L;
    专用JTable表;
    私人JPanel filterRow;
    公共表FilterRow(){
    表=新的JTable(3,5);
    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    JScrollPane scrollPane=新的JScrollPane(表);
    getContentPane().add(滚动窗格);
    table.getColumnModel().addColumnModelListener(此);
    //文本字段面板
    filterRow=新的JPanel(新的FlowLayout(FlowLayout.CENTER,0,0));
    对于(int i=0;i
    3) 否则,请查看
    prepareRederer

    4) 这个问题与
    TableModel


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

    也考虑一个<代码> jScR卷卷子< /> >包含<代码> jPoCTs/COD> > <代码> GridLayout < /代码>,并包含22x22实例<代码> jabel>代码>,或一个合适的子类。这很容易扩展到几千个细胞

    附录:如有必要,
    CellRenderPane
    可以作为一个很好的渲染器,正如建议的那样

    如果使用
    JTable
    进行渲染可伸缩性

  • 这不是滥用;这正是
    TableModel
    的使用方式<代码>表格模型
  • 为您决定的任何内容建立矩形矩阵
    JTable
    只是该模型的一个(高效渲染的)视图

  • 我更喜欢所示的
    AbstractTableModel
    ,因为
    Vector
    很少是理想的数据结构。使用任何使索引最方便的容器
    DefaultTableModel
    非常方便,可以作为扩展
    AbstractTableModel
    的指南。特别是,您需要一个
    setValueAt()


  • 这看起来更像是一个显示问题,而不是一个TableModel问题。你有没有考虑过定制单元渲染?我有。我在问题中提到了这一点。我是
    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);
        }
    }
    
    @Override
    public void setValueAt(Object aValue, int row, int col) {
        ... // update your data structure
        this.fireTableCellUpdated(row, col); // notify the view
    }