2014-10-06 98 views
4

我試圖讓表頭有自動換行。我設法做到了這一點,但第一個數據行正在擴大。表的代碼是:Java JTable標題自動換行

public class GenerateTable extends JTable { 

    private JCheckBox boxSelect = new JCheckBox(); 
    private JTableHeader hdGen; 

    public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer { 

     private static final long serialVersionUID = 1L; 
     int rowHeight = 0; // current max row height for this scan 
     @Override 
     public Component getTableCellRendererComponent(
       JTable table, 
       Object value, 
       boolean isSelected, 
       boolean hasFocus, 
       int row, 
       int column) 
     { 
      /* 
      * row < 0 means header 
      */ 
      if(row >= 0) { 
       setWrapStyleWord(false); 
       return this; 
      } 
      setText((String) value); 
      setWrapStyleWord(true); 
      setLineWrap(true); 
      // current table column width in pixels 
      int colWidth = table.getColumnModel().getColumn(column).getWidth(); 

      // set the text area width (height doesn't matter here) 
      setSize(new Dimension(colWidth, 1)); 

      // get the text area preferred height and add the row margin 
      int height = getPreferredSize().height + table.getRowMargin(); 
      // ensure the row height fits the cell with most lines, row = -1 for header 
      if (column == 2 || height > rowHeight) { 
       table.setRowHeight(row, height); 
       rowHeight = height; 
      } 
      return this; 
     } 
    } 
    LineWrapCellRenderer lwHeader = new LineWrapCellRenderer(); 
    public GenerateTable(GenerateTableModel model) { 
     super(model); 
     this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     /* 
     * Select 
     */ 
     TableColumn colSelect = this.getColumnModel().getColumn(0); 
     colSelect.setCellEditor(new DefaultCellEditor(boxSelect)); 
     colSelect.setPreferredWidth(60); 
     /* 
     * category 
     */ 
     this.getColumnModel().getColumn(1).setResizable(false); 
     this.getColumnModel().getColumn(1).setPreferredWidth(200); 
     /* 
     * Amount values 
     */ 
     for (int i=2;i<model.getColumnCount();i++) { 
      colSelect = this.getColumnModel().getColumn(i); 
      colSelect.setPreferredWidth(100); 
      colSelect.setResizable(false); 
      colSelect.setHeaderRenderer(lwHeader); 
     } 

    } 

} 

的輸出是:

enter image description here

我在調試通過隨後的代碼和LineWrapCellRenderer不被要求的數據線。如果我把代碼拿出來,我會得到一個普通的表格,但是在表頭上沒有換行。這是一個公認的問題還是我錯過了什麼?

任何幫助讚賞

+0

01/05/2014 - 31/05/2014 == 2014年5月 – mKorbel 2014-10-06 10:12:20

+0

如何爲靜態大小標題高度? 'setSize(new Dimension(colWidth,26));'在任何情況下,標題網格單元的底線都需要額外的空間:'table.setRowHeight(row,height + 2);' – 2014-10-06 10:21:02

+0

Thanks Joop,I想到這一點,但仍然不明白爲什麼第一行數據被擴大了很多。 – Mikerb 2014-10-06 10:37:58

回答

7

您可以更容易地實現多線頭。

與許多Swing組件一樣,您可以使用HTML代碼。在HTML中指定<br>元素來指示應該發生換行符/新行的位置。

例如,如果你使用下面的標頭值(列名稱):

String[] columnNames = { 
    "<html>First<br>column</html>", 
    "<html>Second<br>column</html>", 
    "<html>Third<br>column</html>" 
}; 

然後,報頭將被適當地在2行渲染。您甚至不需要創建/使用自定義標題渲染器,默認標題渲染器可以正確處理HTML代碼。

注意:標題高度將由第一列的高度確定。所以你必須爲第一列使用2行HTML值。如果第一列只有一個單詞,則可以另外添加一個空的第二行,如下所示:"<html>Select<br>&nbsp;</html>"

+0

謝謝icza,我喜歡簡單的方法。這工作得很好。 – Mikerb 2014-10-06 10:39:11