繁体   English   中英

双排 header 在 JTable

[英]double row header in JTable

使用表格和 jtable 的即时编码软件让我再次感到困难。

对于单行 header 我使用:

    private class make_table extends AbstractTableModel {
        private String[] headers = headers();
                                            
        Object[][] rows = rows();
        
        public int getColumnCount() {
            return headers.length;
        }

        public int getRowCount() {
            return rows.length;
        }

        public String getColumnName(int col) {
            return headers[col];
        }

        public Object getValueAt(int row, int col) {
            return rows[row][col];
        }

        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
    }   

然后我把它传递给:

table = new JTable(new make_table());

标头(); 方法只返回带有列名的 String[] - 一维数组。

我试图让 headers() 重新运行 2D 数组 - String[][] 和 make_table String[][] 中的 headers 而不是 String[]。 我的问题是如何在 JTable 中渲染/显示它。

我很久以前刚刚将整个方法复制粘贴到另一个项目中,我无法理解它是如何工作的。 我想我可以以某种方式使用我处理行的方式,因为它是二维数组,但我无法理解它。

注意:我已经阅读了一些内容,但似乎都集中在第 1 行和第 2 行中不同数量的单元格上。我希望第一行 header 有 6 个单元格,第二行 header 也有 6 个单元格。

我的问题:我怎样才能进入并显示两行 header JTable? 最好通过二维阵列。

两种不同的方法:

  1. 使用 HTML 作为带有<br>标签的列名来表示每一行
  2. 使用自定义渲染器将列名解析为多行

在这两种情况下,列 header 的高度将取决于第一列中的行数:

在此处输入图像描述

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

public class TableHeaderLines extends JPanel
{
    public TableHeaderLines()
    {
        add( createHeaderUsingHTML() );
        add( createHeaderUsingCustomRenderer() );
    }

    private JComponent createHeaderUsingHTML()
    {
        // the height of the header is determined by the height of the first column

        Object[] columnNames =
        {
            "<html>Column 1<br>multi<br>line</html",
            "Column 2",
            "<html>Column 3<br>more</html",
            "<html>one<br>two<br>three<br>four</html>" // lines won't display completely
        };

        DefaultTableModel model = new DefaultTableModel(columnNames, 5);
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        return new JScrollPane( table );
    }

    private JComponent createHeaderUsingCustomRenderer()
    {
        // the height of the header is determined by the height of the first column
        // the multi line renderer will only work if the first line is multi line

        Object[] columnNames =
        {
            "Column 1,multi,line",
            "Column 2",
            "Column 3,more",
            "one,two,three,four" // 4th line won't display
        };

        DefaultTableModel model = new DefaultTableModel(columnNames, 5);
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());

        table.getTableHeader().setDefaultRenderer( new LineRenderer() );

        return new JScrollPane( table );
    }

    class LineRenderer extends JPanel implements TableCellRenderer
    {
        public LineRenderer()
        {
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            setOpaque( false );
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        }

        public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected,
            boolean hasFocus, final int row, final int column)
        {
            removeAll();

            String[] result = ((String)value).split(",");

            for (int i = 0; i < result.length; i++)
            {
                JLabel label = new JLabel(result[i]);
                label.setFont( table.getTableHeader().getFont() );
                label.setAlignmentX(0.5f);
                add(label);
            }

            return this;
        }
    }

    public static void createAndShowGUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add(new TableHeaderLines());
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM