如何在表中添加行标题?

m1m5dgzv  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(282)

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

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

ig9co6j1

ig9co6j11#

创建一个组件并将该组件添加到 JScrollPane 使用 setRowHeaderView(...) 方法。
所以你可以用 JList 作为包含每行值的组件。
您还需要一个自定义的呈现器,以便行标题像列标题一样呈现。
下面是一个基本示例,每行仅使用一个数字:

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中的行。

相关问题