【问题标题】:How can I correctly calculate the height of a jTable row to ensure that the contained jLabel containing HTML is entirely displayed?如何正确计算 jTable 行的高度以确保包含 HTML 的包含 jLabel 完全显示?
【发布时间】: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。

谢谢,

【问题讨论】:

    标签: java swing


    【解决方案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;
            }
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2016-11-14
      • 2013-07-22
      • 1970-01-01
      • 2015-02-13
      相关资源
      最近更新 更多