2010-08-13 56 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; 
     } 
    } 
} 

我覺得這是我的解決方案一個問題 - 每行中要更新的最後一列最終將是唯一一個在行高中獲得發言權的人。我將解決這個問題作爲讀者的練習。 :-)