如何正确计算 jTable 行的高度以确保包含 HTML 的包含 jLabel 完全显示?

Posted

技术标签:

【中文标题】如何正确计算 jTable 行的高度以确保包含 HTML 的包含 jLabel 完全显示?【英文标题】:How can I correctly calculate the height of a jTable row to ensure that the contained jLabel containing HTML is entirely displayed? 【发布时间】:2011-03-29 10:21:24 【问题描述】:

我有一个 JTable 实例,其中包含许多行。此表中的列是包含 html 格式字符串的 JLabel 实例。

我的一个要求是这些列中的所有数据都应该显示出来。如果列宽(无论出于何种原因)不足以显示所有数据,则文本应换行到下一行。目前文本刚刚被截断。

这段代码说明了问题:

导入 javax.swing.JFrame; 导入 javax.swing.JTable; 导入 javax.swing.table.DefaultTableModel; 公共类 TableTest 公共静态无效主要(最终字符串[]参数) 最终 JTable jTable = new JTable(); jTable.setModel(new DefaultTableModel() 私有静态最终长序列版本UID = 1L; @覆盖 public Object getValueAt(final int row, final int column) final StringBuffer sb = new StringBuffer(); sb.append(""); sb.append("这个文本是红色的 "); sb.append("这个文本是绿色的!"); sb.append(""); 返回 sb.toString(); @覆盖 公共 int getColumnCount() 返回 2; @覆盖 公共 int getRowCount() 返回 2; ); 最终的 JFrame jFrame = new JFrame(); jFrame.getContentPane().add(jTable); jFrame.setSize(120, 80); jFrame.pack(); jFrame.setTitle("表格测试"); jFrame.setLocationRelativeTo(null); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jFrame.setVisible(true);

运行上面的 SSCCE 时,我的问题可能会变得更加清晰。如果调整 JFrame 的大小,我希望自动修改行高以允许显示 JPanel 的全部内容。

由于 HTML 的要求,我无法使用 JTextArea。

谢谢,

【问题讨论】:

【参考方案1】:

这对周五早上来说是一个很好的挑战。

答案是使用一个自定义的 TableCellRenderer 来动态更新表格高度:

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

public class ScratchSpace 


    public static void main(final String[] args) 

        final JTable jTable = new JTable();

        jTable.setModel(new DefaultTableModel() 
            private static final long serialVersionUID = 1L;

            @Override
            public Object getValueAt(final int row, final int column) 
                final StringBuffer sb = new StringBuffer();
                sb.append("<html>");
                sb.append("<font color=\"red\">this text is red</font> ");
                sb.append("<font color=\"green\">this text is green!</font>");
                sb.append("</html>");
                return sb.toString();
            

            @Override
            public int getColumnCount() 
                return 2;
            

            @Override
            public int getRowCount() 
                return 2;
            
        );


        jTable.getColumnModel().getColumn(0).setCellRenderer(new MyTableCellRenderer());
        jTable.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());
        final JFrame jFrame = new JFrame();
        jFrame.getContentPane().add(jTable);
        jFrame.setSize(120, 80);
        jFrame.pack();
        jFrame.setTitle("Table test");
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);

    

    private static class MyTableCellRenderer extends JLabel implements TableCellRenderer 

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
            setText(String.valueOf(value));
            table.setRowHeight(row, getPreferredSize().height);
            return this;
        
    

我认为我的解决方案存在问题 - 每行中要更新的最后一列最终将是唯一在行高方面有发言权的列。我把解决这个问题留给读者作为练习。 :-)

【讨论】:

以上是关于如何正确计算 jTable 行的高度以确保包含 HTML 的包含 jLabel 完全显示?的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用列标题创建JTable,不添加任何行

如何正确测量文字高度

如何更改具有特定列值的 JTable 整行的颜色

java Jtable 如何动态添加button按钮

(Java) JTable行的用户选择

opencv如何将lena.jpg的灰度值读取出来并在计算机上保存下来