2013-08-02 3 views
2

JTable 셀에 여러 줄을 래핑해야하는 이 있습니다.Jtable에서 JTable Cellrenderer를 호출 할 수 없습니다.

public class MultiLineTableCellRenderer 
     extends JTextArea implements TableCellRenderer { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public MultiLineTableCellRenderer() { 
     setLineWrap(true); 
     setWrapStyleWord(true); 
     setOpaque(true); 
    } 

    public Component getTableCellRendererComponent(JTable table, 
           Object value, boolean isSelected, 
           boolean hasFocus, int row, int column) { 
     setText(value.toString());//or something in value, like value.getNote().. 
     if (isSelected) { 
      setForeground(table.getSelectionForeground()); 
      setBackground(table.getSelectionBackground()); 
     } else { 
      setForeground(table.getForeground()); 
      setBackground(table.getBackground()); 
     } 
     setSize(table.getColumnModel().getColumn(column).getWidth(), 
      getPreferredSize().height); 
     if (table.getRowHeight(row) != getPreferredSize().height) { 
      table.setRowHeight(row, getPreferredSize().height); 
     } 
     return this; 
    } 
} 

내가 만들고 내가 동적으로 데이터베이스

DefaultTableModel model = (DefaultTableModel)cnr_DATA.getModel(); 

removeAllCurrentRows (모델)에서의 JTable의 내용을 업데이트하고 myjtable(cnr_DATA)

MultiLineTableCellRenderer r = new MultiLineTableCellRenderer(); 
cnr_DATA.setDefaultRenderer(String.class, r); 
cnr_DATA.setModel(new DefaultTableModel(data,columns){ 
    public Class getColumnClass(int col){ 
     return String.class; 
    }; 
}); 

에 대한 default cell renderer 등이 cell renderer을 할당하고;

Vector<DocumentRow> data = 
    RecycleSQL.readRecycledDocuments();//this line returning vector of objects 
for(DocumentRow object:data) 
    model.addRow(new string[]{object.getFilename(), 
      object.getTitle(),object.getLastTouched() 
          ,object.getLastTouchedBy()}); 
model.setRowCount(data.size()); 
cnr_DATA.revalidate(); 

내 문제는 mycellrenderer가 호출되지 않는 데이터를 포장되지 않는 것입니다. 어떤 사람은 JTable의 내용을 업데이트 한 후 어떻게 부르는지 조언 해주십시오. 제안에 따라 코드를 수정 한 후에 Madprogrammer의 제안과 호버

따른

업데이트. 이제 cellrenderer이 호출되었지만 행 높이를 기본값으로 쉬고 있습니다. 이 행의 높이를 설정 한 후 올바르게 다시 기본값을 쉬고 있음을 의미 디버그 문

[2013-08-02 01:20:53,335] [AWT-EventQueue-0] DEBUG MultiLineTableCellRenderer - setting row height 3 128 
[2013-08-02 01:20:53,335] [AWT-EventQueue-0] DEBUG MultiLineTableCellRenderer - setting row height 3 16 

의 로그입니다

+0

'setModel '호출이 기본 편집기를 재설정하고 열 모델을 변경하는 것으로 의심됩니다. 그 진술을 교환하고 싶을 수도 있습니다 – MadProgrammer

+0

미안하지만 당신이 무엇을 바꾸고 싶습니까 (스왑) – Ashish

+0

모델이 먼저 설정되고 렌더러가 – MadProgrammer

답변

3

이 나에게 용의자를 찾습니다 :

cnr_DATA.setDefaultRenderer(String.class, r); // ?? String.class 

모델에 문자열 데이터가 있고 getColumnClass(...)에 의해 반환 된 열 유형이 문자열을 반환합니까? 그 대신 셀 렌더러를 필요로하는 열에 맞게 설정하십시오.

+0

예, string []이 (가) 저장되며 열 유형이 string입니다. 나는 그것에 따라 코드를 수정했다. – Ashish

+0

메모리에서 'DefaultTableModel # getColumnClass'는'Object'를 반환합니다. OP가이 메소드를 오버라이드하여'String'을 반환해야합니다. +1하고 싶으니까요. 당신이 필요에 따라 확인하고 업데이트 할 것이라는 것을 알고 있습니다. (게다가 3 자리에 가깝습니다);) – MadProgrammer

+0

마지막으로 나는 그것을 고쳤다. 나는 지금 대답을 쓸 것이다. 당신이 항상 좋은 힌트를 주셔서 감사합니다. – Ashish

관련 문제