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

ОБНОВЛЕНИЕ:

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

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

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

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

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

Я делаю таблицы в java для отображения значений объектов из класса «DinnerTable». Я создал собственный класс DinnerTableModel, который расширяет AbstractTableModel и реализует TableModel. Однако мне кажется, что когда я изменяю свои исходные объекты «DinnerTable», соответствующие объекты в tableModel вообще не меняются. Решение этой проблемы, которое я искал в Google, заключалось в создании 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");
    }
}
}

///////////


person Ptolemorphism    schedule 23.09.2017    source источник
comment
Вы не публикуете действительный минимально воспроизводимый пример, код, который компилируется и запускается для нас. Если вам нужна достойная помощь, улучшите этот вопрос, создав и опубликовав его. Да, это требует от вас дополнительной работы, но вы требуете от нас дополнительной работы бесплатно, так что это справедливая просьба, я думаю.   -  person Hovercraft Full Of Eels    schedule 23.09.2017


Ответы (1)


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

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

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

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

person camickr    schedule 23.09.2017
comment
Спасибо за ответ. Однако что, если данные TabelModel изменяются не прямым щелчком по таблице, а нажатием кнопки JButton на другой вкладке, будет ли она работать? - person Ptolemorphism; 23.09.2017