2010-08-13 34 views
2

我有一个JTable实例,包含多个行。该表中的列是包含HTML格式字符串的JLabel实例。如何正确计算jTable行的高度以确保包含HTML的包含jLabel完全显示?

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

这段代码说明了这个问题:在运行上述SSCCE时

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

} 

} 

我的问题可能会变得更加清晰。如果JFrame被调整大小,我想要自动修改行高以允许显示JPanel的全部内容。

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

感谢,

回答

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

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