2013-02-15 115 views
4

我想在另一個JTable的列(使用CellRenderer)內嵌套一個JTable。如何在JTable內部呈現JTable?

實施例(錯誤)輸出:

enter image description here

爲什麼下面的例子不是表內輸出一個表?

import java.awt.Component; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableCellRenderer; 

public class Test { 

    public static void main(String[] args) { 
     JTable table = new JTable(new CustomTableModel()); 
     table.setDefaultRenderer(Person.class, new CustomRenderer()); 
     JPanel panel = new JPanel(); 
     panel.add(new JScrollPane(table)); 
     JFrame frame = new JFrame(); 
     frame.setContentPane(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

@SuppressWarnings("serial") 
class CustomTableModel extends AbstractTableModel { 

    @Override 
    public int getColumnCount() { 
     return 2; 
    } 

    @Override 
    public int getRowCount() { 
     return 1; 
    } 

    @Override 
    public Object getValueAt(int row, int col) { 
     if (col == 0) { 
      return new Person("Bob"); 
     } else { 
      return "is awesome!"; 
     } 
    } 
} 

@SuppressWarnings("serial") 
class CustomRenderer extends JPanel implements TableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int col) { 
     JTable t = new JTable(new CustomTableModel()); 
     add(new JScrollPane(t)); 
     return this; 
    } 
} 

class Person { 

    public String name = ""; 

    public Person(String name) { 
     this.name = name; 
    } 
} 

回答

4

不要將子表添加到滾動窗格。相反,嘗試添加表到一個BorderLayout的一個JPanel的中心位置,然後添加表頭到北位置

主要的原因是滾動窗格不會是互動的,並可能隱藏數據

更新

我的手機,所以它難以閱讀的代碼:P

在你的主表的模型,你需要重寫的getColumnClass方法,並確保你重新調整Person.class爲所需的列(以及正確的類類型) e其他列)

+0

我會嘗試滾動窗格,但w.r.t.沒有返回這個 - 我認爲最好的做法是僅將渲染器的主要組件實例化一次。編輯:我仍然收到一個沒有滾動窗格的字符串值 - 我會上傳一個截圖。 – sdasdadas 2013-02-15 21:39:47

+1

如果可以縮短數量(如果短暫對象),但是,在每次交互中創建JTable則更好 – MadProgrammer 2013-02-15 21:45:00

+0

這是事實,但由於滾動窗格不阻止顯示JTable,因此這些是次要的。 – sdasdadas 2013-02-15 21:46:30