2013-02-15 4 views
4

Я пытаюсь вставить JTable внутри другого столбца JTable (используя CellRenderer).Как визуализировать 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

Не добавляйте вспомогательную таблицу в панель прокрутки. Вместо этого попробуйте добавить таблицу в центральное положение в JPanel с BorderLayout, затем добавьте таблицы заголовка в положение СЕВЕРО

Основной причиной этого является панель прокрутки не будет интерактивным и может скрыть данные

Обновлен

Я по телефону, так что трудно читать код: P

в вашей основной модели таблицы, необходимо переопределить метод getColumnClass и убедитесь, что вы перенастройкой Person.class для требуемый столбец (и правильные типы классов для th другие колонки)

+0

Я попробую панель прокрутки, но w.r.t. не возвращая этого - я был в предположении, что лучше всего создать экземпляр основного компонента средства визуализации только один раз. EDIT: Я все еще получаю значение String без панели прокрутки - я выложу скриншот. – sdasdadas

+1

Лучше, если вы можете уменьшить число, если короткоживущие объекты, но, тем не менее, ваше создание JTable на каждом взаимодействии – MadProgrammer

+0

Это правда, но это вторичные точки, поскольку панель прокрутки не препятствовала отображению JTable. – sdasdadas

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