private void myProfileTabStateChanged(javax.swing.event.ChangeEvent evt) {
if (myProfileTab.getSelectedComponent() == EditProfile) {
editProfile();
} else if (SearchAcademic == myProfileTab.getSelectedComponent()) {
AcademicDAO aDao = new AcademicDAO();
try {
List<AcademicDTO> listAll = aDao.listAll(AcademicDTO.class);
searchTable.setData(listAll);
} catch (DBException ex) {
Logger.getLogger(MainMenu.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public class ListDataUI<T extends BaseDTO> extends javax.swing.JPanel {
public ListDataUI() {
this.summaryColumnsAndTheirViewNames = Collections.emptyMap();
this.dtoSummaryFields = Collections.emptyList();
this.summaryTableModel = new SummaryTableModel();
initComponents();
this.summaryTable.setModel(summaryTableModel);
initListeners();
}
/**
* Creates new form ListDataUI
*/
public ListDataUI(LinkedHashMap<String, String> summaryColumnsAndTheirViewNames) {
this.summaryColumnsAndTheirViewNames = summaryColumnsAndTheirViewNames;
this.dtoSummaryFields = new ArrayList<String>(summaryColumnsAndTheirViewNames.keySet());
this.summaryTableModel = new SummaryTableModel();
initComponents();
this.summaryTable.setModel(summaryTableModel);
initListeners();
}
public ListDataUI(List<String> dtoSummaryFields) {
this.summaryColumnsAndTheirViewNames = Collections.emptyMap();
this.dtoSummaryFields = new ArrayList<String>(dtoSummaryFields);
this.summaryTableModel = new SummaryTableModel();
initComponents();
this.summaryTable.setModel(summaryTableModel);
initListeners();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
tableSp = new javax.swing.JScrollPane();
summaryTable = new javax.swing.JTable();
setLayout(new java.awt.BorderLayout());
summaryTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
tableSp.setViewportView(summaryTable);
add(tableSp, java.awt.BorderLayout.CENTER);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JTable summaryTable;
private javax.swing.JScrollPane tableSp;
// End of variables declaration
private List<T> data;
private Map<String, String> summaryColumnsAndTheirViewNames;
private List<String> dtoSummaryFields;
private SummaryTableModel summaryTableModel;
public List<T> getData() {
return data;
}
public void removeSelectedDataRow() {
final int selectedRow = summaryTable.getSelectedRow();
if (selectedRow != -1) {
final int modelIndex = summaryTable.convertRowIndexToModel(selectedRow);
data.remove(modelIndex);
summaryTableModel.fireTableRowsDeleted(modelIndex, modelIndex);
}
}
public void setData(List<T> data) {
this.data = data;
summaryTableModel.fireTableDataChanged();
if (data.size() > 0) {
summaryTable.getSelectionModel().setSelectionInterval(0, 0);
}
}
我正在尝试在表searchTable
中显示数据库中的行数据,我调用了setData()
方法。我在"searchTable.setData(listAll);"行设置了一个断点,listAll有来自数据库的所有数据,但没有显示在searchTable上。
问题在于您的 JTable 模型连接到您的数据。所以你的JTable和它的表模型完全不知道这个List<T> data
。
所以基本上你需要有一个TableModel
来接收你的列表,然后触发一个适当的TableModelEvent
。TableModel
应实现很少的基本方法来指示如何访问数据以及要显示哪些数据。
在下面找到这种实现的一个非常基本的示例(这里它基于显示名字和姓氏的Person
List
)。根据您的情况进行调整应该非常简单:
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
public class TestListTableModel {
class MyTableModel extends AbstractTableModel {
private List<Person> baseModel;
public MyTableModel() {
baseModel = new ArrayList<TestListTableModel.Person>();
}
public MyTableModel(List<Person> baseModel) {
super();
this.baseModel = new ArrayList<Person>(baseModel);
}
@Override
public int getRowCount() {
return baseModel.size();
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "First Name";
case 1:
return "Last Name";
}
return null;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return getPersonAtIndex(rowIndex).getFirstName();
case 1:
return getPersonAtIndex(rowIndex).getLastName();
}
return null;
}
public Person getPersonAtIndex(int rowIndex) {
return baseModel.get(rowIndex);
}
public int getIndexOfPerson(Person person) {
return baseModel.indexOf(person);
}
public void addPerson(Person person) {
baseModel.add(person);
fireTableRowsInserted(baseModel.size() - 1, baseModel.size() - 1);
}
public void removePerson(Person person) {
int removed = baseModel.indexOf(person);
if (removed > -1) {
baseModel.remove(removed);
fireTableRowsDeleted(removed, removed);
}
}
public void setBaseModel(List<Person> baseModel) {
this.baseModel = baseModel;
fireTableChanged(new TableModelEvent(this));
}
}
protected void initUI() {
List<Person> personModel = new ArrayList<TestListTableModel.Person>();
personModel.add(new Person("John", "Smith"));
personModel.add(new Person("Peter", "Donoghan"));
personModel.add(new Person("Amy", "Peterson"));
personModel.add(new Person("David", "Anderson"));
JFrame frame = new JFrame(TestListTableModel.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyTableModel tableModel = new MyTableModel();
JTable table = new JTable(tableModel);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
tableModel.setBaseModel(personModel);
}
public class Person {
private final String firstName;
private final String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestListTableModel().initUI();
}
});
}
}
首先,您应该为JTable
创建一个表模型。对数据的任何更新都应在表模型上完成。
将数据设置为TableModel
。如果每一行都是Object
则将对象添加到"表模型"列表中。
然后使用setModel
方法将模型设置为表中。例如:table.setModel(customModel);
PS:更喜欢已经实现所有必需方法的DefaultTableModel,而不是使用AbstractTableModel。