2013-08-15 2 views
0

Это мой класс ClanModel. Таблица основана на карте дерева.Проблемы с JTable и JModel

public class ClanModel extends AbstractTableModel{ 
    private Map<Integer, ClanMember> clanMembers; 
    private final String[] columnNames = {"Name", "Rank"}; 

    ClanModel(Map<Integer, ClanMember> clanMembers){ 
     this.clanMembers = clanMembers; 
    } 

    @Override 
    public int getRowCount() { 
     return clanMembers.size(); 
    } 

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

    @Override 
    public String getColumnName(int column){ 
     return columnNames[column]; 
    } 

    @Override 
    public Object getValueAt(int row, int column) { 
     if(column == 0) return clanMembers.get(row).getName(); 
     if(column == 1) return clanMembers.get(row).getRank(); 
     return 1; 
    } 

    @Override 
    public void setValueAt(Object value, int row, int column) { 
     if(column == 0) clanMembers.get(row).setName((String) value); 
     if(column == 1) clanMembers.get(row).setRank((Rank) value); 
     fireTableCellUpdated(row, column); 
    } 
} 

Это в ГИП конструктор

clanTable = new JTable(new ClanModel(clanMembers)); 
panel.add(clanTable); 

Карта заполняется на кнопку печати, которая работает. Тем не менее, таблица не появляется перед нажатием кнопки или после. Я также получаю сообщение об ошибке при каждом изменении размера окна gui.

У меня есть приблизительное представление о том, что мне нужно сделать, чтобы исправить это, но оно не работает.

+0

Я не вижу 'invokeLater()' или 'setVisible()'. Пожалуйста, отредактируйте свой вопрос, чтобы включить [sscce] (http://sscce.org/), который показывает проблему, которую вы описываете. – trashgod

+0

Какая ошибка возникает при изменении размера графического интерфейса? Кроме того, есть 'Container', в котором' JTable' добавлен где-то в вашем 'Window'? –

+1

Вероятно, он не ошибся; необходимость изменить размер кадра для получения неявного 'repaint()', вероятно, вызвана ошибочным 'setVisible()'. – trashgod

ответ

1

Попробуйте двигаться setVisible() так что это послеadd() и pack(). См. Также Initial Threads.

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      JFrame f = new JFrame(); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      JTable table = new JTable(new ClanModel(…)); 
      f.add(new JScrollPane(table)); 
      f.pack(); 
      f.setLocationRelativeTo(null); 
      f.setVisible(true); 
     } 
    }); 
}