2014-10-19 3 views
0

Я потянув запись базы данных из MySql, я могу сделать это с помощью метода нижедисплея ResultSet в 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, и поэтому я все еще hav 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

EDIT:

Попробуйте следующий, кажется, это то, что вы хотите;

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, но код, который мне нужен, должен обеспечивать высоту строки автоматически. Высота строки будет зависеть от длины строки. некоторые из них будут иметь буксирные линии, некоторые из которых будут иметь 3 или более, а некоторые будут иметь только одну (одну) линию. Я все еще пытаюсь понять это и буду признателен, если кто-то сможет показать способ сделать это :) – pandoy

+0

Вы можете сделать это, просто верните 'area' в' getTableCellEditorComponent'/'getTableCellRendererComponent', но вам нужно использовать' JScrollPane' с 'JTeatArea'. – alex2410

+0

@pandoy Попробуйте изменить мой отредактированный код. – alex2410

 Смежные вопросы

  • Нет связанных вопросов^_^