首页 > 解决方案 > 如何在表格中添加行标题?

问题描述

我找不到将行标题添加到表中的解决方案。使用水平标题一切正常,但如何将垂直标题(行标题)设置在左侧?这是我目前拥有的代码:

import javax.swing.*;
import java.awt.*;

public class Table{

    public static void main(String[] args) {

        int n = 5;
        int m = 5;

        String[][] arrayList = new String[n][m];
        String[] horizontalHeader = new String[n];
        String[] verticalHeader = new String[n];

        for (int i = 0; i < n; i++) {
            horizontalHeader[i] = "column" + i;
            verticalHeader[i] = "row" + i;
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arrayList[i][j] = "value";
            }
        }

        JFrame frame = new JFrame("Table");
        JTable table = new JTable(arrayList, horizontalHeader);
        JScrollPane scrollPane = new JScrollPane(table);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }
}

标签: javaswing

解决方案


您创建一个组件并将该组件添加到JScrollPaneusingsetRowHeaderView(...)方法。

因此,您可以使用 aJList作为包含每行值的组件。

您还需要一个自定义渲染器,以便像列标题一样渲染行标题。

这是一个基本示例,每行只使用一个数字:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableRowHeader extends JList implements TableModelListener
{
    private JTable table;

    @SuppressWarnings("unchecked")
    public TableRowHeader(JTable table)
    {
        this.table = table;

        setAutoscrolls( false );
        setCellRenderer(new RowHeaderRenderer());

        setFixedCellHeight(table.getRowHeight());
        setFixedCellWidth(50);
        setFocusable( false );
        setModel( new TableListModel() );
        setOpaque( false );
        setSelectionModel( table.getSelectionModel() );
        table.getModel().addTableModelListener( this );
    }

    public void tableChanged(TableModelEvent e)
    {
        if (e.getType() == TableModelEvent.INSERT
        ||  e.getType() == TableModelEvent.DELETE)
        {
            repaint();
        }
    }

    /*
     *  Use the table to implement the ListModel
     */
    class TableListModel extends AbstractListModel
    {
        public int getSize()
        {
            return table.getRowCount();
        }

        public Object getElementAt(int index)
        {
            return String.valueOf(index + 1);
        }
    }

    /*
     *  Use the table row header properties to render each cell
     */
    class RowHeaderRenderer extends DefaultListCellRenderer
    {
        RowHeaderRenderer()
        {
            setHorizontalAlignment(CENTER);
            setOpaque(true);
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
            setFont(table.getTableHeader().getFont());
            setBackground(table.getTableHeader().getBackground());
            setForeground(table.getTableHeader().getForeground());
        }

        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {

            if (isSelected)
            {
                setBackground( table.getSelectionBackground() );
            }
            else
            {
                setBackground( table.getTableHeader().getBackground() );
            }

            setText( (value == null) ? "" : value.toString() );

            return this;
        }
    }
    private static void createAndShowUI()
    {
        JTable table = new JTable( 1000, 10 );
        JScrollPane scrollPane = new JScrollPane( table );
        scrollPane.setRowHeaderView( new TableRowHeader( table) );

        JFrame frame = new JFrame("Row Header Test");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

如果您想要在行标题中使用不同的值,那么您将使用您自己的包含您想要显示的值的 ListModel,而不是 TableListModel。

如果您可以从 TableModel 中动态添加/删除数据行,那么您还需要从 ListModel 中添加/删除行的逻辑。


推荐阅读