首页 文章

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

提问于
浏览
2

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

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

这段代码说明了这个问题:

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableTest {

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

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

 }

}

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

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

谢谢,

1 回答

  • 5

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

    答案是使用自定义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;
            }
        }
    }
    

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

相关问题