JTable 中的双行标题

如何解决JTable 中的双行标题

我使用 table 和 jtable 编写软件让我再次感到困难。

对于单行标题我使用:

    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() 重新运行二维数组 - String[][] 和 make_table String[][] 中的标题而不是 String[]。我的问题是如何在 JTable 中呈现/显示它。

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

注意:我读过一些东西,但似乎都集中在第 1 行和第 2 行中不同数量的单元格上。我希望第一行标题有 6 个单元格,第二行也有标题 6 个单元格。

我的问题: 我怎么能进入并显示两行标题 JTable?最好通过二维数组。

解决方法

两种不同的方法:

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

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

enter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?