Java TableModel не обновляется?

ОБНОВЛЕНИЕ:

Я нашел этот ответ @MadProgrammer, и он работал!

Обновление JTable по нажатию кнопки

По сути, вы добавляете метод refresh() в TableModel, который принимает обновленный объект. Затем при каждом нажатии кнопки вызывается этот метод табличной модели.

Я предполагаю, что вы также можете расширить JTable и поместить этот метод в расширенный класс. Могут быть более эффективные решения, но я буду придерживаться этого пока. Спасибо!

/ ************************************************* *************************** /

Я делаю таблицы в Java для отображения значений объектов из класса "DinnerTable". Я создал собственный класс DinnerTableModel, который расширяет AbstractTableModel и реализует TableModel. Тем не менее, мне кажется, что когда я изменяю мои исходные объекты DinnerTable, соответствующие объекты в tableModel не изменяются вообще. Решением этой проблемы, которую я погуглил, было создание TableModelListener. Тем не менее, у меня также есть другой JTable, в котором нет этого слушателя, но он прекрасно работает. Основное различие между этими таблицами заключается в том, что JButton, вызывающий изменение значения этих объектов, был на одной вкладке с рабочей таблицей, но на другой вкладке, чем нерабочий DinnerTable в JTabbedPane. Каков эффективный способ обновления этих DinnerTableModels? (Мне нужно 38 из них). Спасибо!

package DinnerList;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class DinnerTableModel extends AbstractTableModel implements TableModel{

private final String[] columnNames;
private DinnerTable dt;

public DinnerTableModel(DinnerTable popopo)
{
    dt=popopo;
    columnNames= new String[1];
    columnNames[0]=popopo.getTableNumber()+". "+popopo.getTeacherName();
}

 public String getColumnName(int col) 
{
        return columnNames[0];
}
public Object getValueAt(int rowIndex, int colIndex)
{
    if(rowIndex<7)
    {
        System.out.println(dt.getMembers().size());
        if(dt.getMembers().size()>rowIndex)
        {
            System.out.println("haha");
            return dt.getMembers().get(rowIndex);
        }
        else
        {
            return null;
        }
    }
    else
    {
        System.out.println("Error: attempting to getValue at row>=7 in DTM");
        return null;
    }
}


public Class getColumnClass(int c) 
{
    return Student.class;
}
public boolean isCellEditable(int row, int col) 
{
    return true;
}

public void setValueAt(Object b,int row, int col)
{
    if(b instanceof Student)
    {
        dt.getMembers().set(row, (Student)b);
    }
    else
    {
        System.out.println("Error: Attemping to put nonstudent into student in DTM");
    }
    fireTableCellUpdated(row, col);
}

}

///////////////////////////////////

package DinnerList;

import java.util.ArrayList;
import java.util.List;

public class DinnerTable 
{
private List<Student> members= new ArrayList<Student>(7);
private int tableNumber=0;
private int capacity=0;
private String teacherName="";
private boolean available=true;

public DinnerTable(int a, int b, String c, boolean d)
{
    tableNumber=a;
    capacity=b;
    teacherName=c;
    available=d;
}


public void add(Student s)
{
    if(available&&(members.size()<capacity))
    { this.members.add(s); }
    else if(!available)
    { System.out.println("Adding Student failed, table "+tableNumber+" not available");}
    else
    { System.out.println("Adding Student failed, table "+tableNumber+" is full");}
}


public List<Student> getMembers(){return members;}
public void remove(Student s) 
{
    if(members.contains(s))
    {
        members.remove(s);
    }
    else
    {
        System.out.println("Failed to remove student from table because it wasn't there");
    }
}
}

///////////

1 ответ

TableModel должен хранить данные. Затем, когда данные изменяются, вы вызываете соответствующий метод fireXXX(...) объекта AbstractTableModel, чтобы сказать таблице перерисовать себя.

Затем в TableModel вносятся изменения в данные, и TableModel обновит ваш пользовательский объект.

Это в основном означает, что структуры данных класса DinnerTable должны быть частью DinnerTableModel, а не отдельным классом.

См. Модель таблицы строк для пошагового руководства по созданию пользовательской модели таблицы для пользовательского объекта.

Другие вопросы по тегам