2014-10-19 59 views
0

我從MySql拉數據庫中的記錄,我能夠做到這一點使用下面的方法顯示結果集的JTable中的細胞具有多

private void txt_clientNameKeyReleased(java.awt.event.KeyEvent evt) {           

    String sql = "Select client_id as 'Client ID', name_lastName as 'Full Name', case_number as 'Case #', hearing_date as 'Hearing Date', rtc_mtc as 'RTC/MTC', place as 'Place', status as 'Status', note as 'Notes', billing as 'Billed' from hearing_history where name_lastName like '%"+ txt_clientName.getText() +"%' "; 

    try{ 
     if(conn==null){ 

      conn = ConnectDB.ConDB(); 
     }else{ 
      conn = ConnectDB.ConDB(); 
     } 

     pst = conn.prepareStatement(sql); 
     rs = pst.executeQuery(); 

     jTable1.setModel(DbUtils.resultSetToTableModel(rs));    

    }catch(Exception e){ 
     JOptionPane.showMessageDialog(null, e); 
    }finally { 
     close(); 

    } 
} 

它工作正常,但我有應該有一個多行一列或者包裝單詞以增加單元格的高度。

我現在使用java swing 4個月了,我還沒有看到/遇到了高級技巧來操作jtable,因爲我希望它能夠執行。

我搜索這個網站,發現從這個環節做到最簡單的辦法

Auto adjust the height of rows in a JTable

從camickr

private void updateRowHeights() 
{ 
try 
{ 
    for (int row = 0; row < table.getRowCount(); row++) 
    { 
     int rowHeight = table.getRowHeight(); 

     for (int column = 0; column < table.getColumnCount(); column++) 
     { 
      Component comp = table.prepareRenderer(table.getCellRenderer(row, column), row, column); 
      rowHeight = Math.max(rowHeight, comp.getPreferredSize().height); 
     } 

     table.setRowHeight(row, rowHeight); 
    } 
} 
catch(ClassCastException e) {} 

}

這確實是一個不錯的代碼,我想,但我試過了,我注意到高度從16(默認行高)增加到20,所以我仍然擁有e在單元格中的一行。

我行

 jTable1.setModel(DbUtils.resultSetToTableModel(rs));    
     updateRowHeights(); 

我真的很感激任何幫助,將會把我的腳在正確的軌道上,使這項工作對我以後調用此方法..提前

謝謝..

回答

2

默認渲染器/編輯器不支持多行。您可以嘗試使用自定義TableCellEditor/TableCellRenderer。在表格單元格檢查與JTextArea下面的例子:

import java.awt.Component; 

import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 

public class TestFrame extends JFrame { 

    public TestFrame() { 
     init(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private void init() { 
     JTable t = new JTable(new Object[][]{{"a\n\rb","1"},{"a\n\rb","2"}},new Object[]{1,2}); 

     add(new JScrollPane(t)); 
     t.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaColumn()); 
     t.getColumnModel().getColumn(0).setCellEditor(new JTextAreaColumn()); 
     t.setRowHeight(50); 
    } 


    public static void main(String args[]) { 
     new TestFrame(); 
    } 


    private class JTextAreaColumn extends AbstractCellEditor implements TableCellRenderer,TableCellEditor { 

     private JTextArea area = new JTextArea(); 
     private JScrollPane pane = new JScrollPane(area); 

     @Override 
     public Object getCellEditorValue() { 
      return area.getText(); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, 
       Object value, boolean isSelected, int row, int column) { 
      area.setText(value == null ? "" : value.toString());   
      return pane; 
     } 

     private void setColor(boolean isSelected, JTable table) { 
      area.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); 
      area.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 
      area.setText(value == null ? "" : value.toString()); 
      setColor(isSelected,table); 
      return pane; 
     } 

    } 

} 

enter image description here

詳情請閱讀tutorial

編輯:

嘗試下一個,似乎你想要的東西;

import java.awt.Component; 

import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.event.CellEditorListener; 
import javax.swing.event.ChangeEvent; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 

public class TestFrame extends JFrame { 

    private JTable t; 


    public TestFrame() { 
     init(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private void init() { 
     t = new JTable(new Object[][]{{"a\n\rb","1"},{"a\n\rb\n\rb\n\rb\n\rb","2"}},new Object[]{1,2}); 

     add(new JScrollPane(t)); 
     t.getColumnModel().getColumn(0).setCellRenderer(new JTextAreaColumn()); 
     JTextAreaColumn editor = new JTextAreaColumn(); 
     editor.addCellEditorListener(getEditorListener()); 
     t.getColumnModel().getColumn(0).setCellEditor(editor); 
     updateRowHeights(t); 
    } 

    private CellEditorListener getEditorListener() { 
     return new CellEditorListener() { 

      @Override 
      public void editingStopped(ChangeEvent e) { 
       updateRowHeights(t); 
      } 

      @Override 
      public void editingCanceled(ChangeEvent e) { 
       updateRowHeights(t); 
      } 
     }; 
    } 

    private void updateRowHeights(JTable table) { 
     try { 
      for (int row = 0; row < table.getRowCount(); row++) { 
       int rowHeight = table.getRowHeight(); 

       for (int column = 0; column < table.getColumnCount(); column++) { 
        Component comp = table.prepareRenderer(
          table.getCellRenderer(row, column), row, column); 
        rowHeight = Math.max(rowHeight, 
          comp.getPreferredSize().height); 
       } 

       table.setRowHeight(row, rowHeight); 
      } 
     } catch (ClassCastException e) { 
     } 
    } 

    public static void main(String args[]) { 
     new TestFrame(); 
    } 


    private class JTextAreaColumn extends AbstractCellEditor implements TableCellRenderer,TableCellEditor { 

     private JTextArea area = new JTextArea(); 
     private JScrollPane pane = new JScrollPane(area); 

     @Override 
     public Object getCellEditorValue() { 
      return area.getText(); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, 
       Object value, boolean isSelected, int row, int column) { 
      area.setText(value == null ? "" : value.toString());   
      return pane; 
     } 

     private void setColor(boolean isSelected, JTable table) { 
      area.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); 
      area.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 
      area.setText(value == null ? "" : value.toString()); 
      setColor(isSelected,table); 
      return area; 
     } 

    } 

} 
+0

謝謝alex2410,但我需要的代碼應該自動提供行的高度。行高將取決於字符串的長度。一些將有兩條線,一條將有三條或更多,一些只有一條(單條)線。我仍然試圖找出它,並會欣賞,如果有人可以展示一種方式來做到這一點:) – pandoy 2014-10-21 12:51:07

+0

你可以做到這一點,只需在'getTableCellEditorComponent' /'getTableCellRendererComponent'返回'area',但你需要使用'JScrollPane' 'JTeatArea'。 – alex2410 2014-10-21 12:56:47

+0

@pandoy嘗試我編輯的代碼。 – alex2410 2014-10-21 13:02:42