如何正确计算 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 完全显示?的主要内容,如果未能解决你的问题,请参考以下文章