如何在JTable内部呈现JTable?

如何在JTable内部呈现JTable?

问题描述:

我想在另一个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; 
    } 
} 

不要将子表添加到滚动窗格。相反,尝试添加表到一个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