新手请寻求帮助:-)
我正在做一个小项目,以便熟悉Java桌面开发和数据库连接。
附加的代码在实例化后给我一个空的TableModel,因此没有数据显示在JFrame中。使用Test.showFrame();从主窗口的菜单实例化测试类。
package ...
import ...
public class Test extends JPanel {
public Test() {
initializePanel();
}
private void initializePanel() {
// Creates an instance of TableModel
CategoryTableModel tableModel = new CategoryTableModel();
System.out.println(tableModel.getRowCount());
// Creates an instance of JTable with a TableModel
// as the constructor parameters.
JTable table = new JTable(tableModel);
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
this.setPreferredSize(new Dimension(500, 200));
this.setLayout(new BorderLayout());
this.add(scrollPane, BorderLayout.CENTER);
}
public static void showFrame() {
JPanel panel = new Test();
panel.setOpaque(true);
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
class CategoryTableModel extends AbstractTableModel {
private List<Category> all = null;
private Iterator<Category> iterator = null;
private int tableRowCount;
private TableModel tableModel;
public CategoryTableModel(){
Vector tableData = new Vector();
// TableModel's column names
Vector<String> tableHeaders = new Vector<String>();
tableHeaders.add("Category");
// Database call
all = new ReadCategory().allCategories();
// TableModel's data
for(Object o : all) {
Vector<Object> row = new Vector<Object>();
all.forEach((n) -> row.add(new Category().getName()));
tableData.add(row);
System.out.println("row added");
}
tableRowCount = tableData.size();
tableModel = new DefaultTableModel(tableData, tableHeaders);
System.out.println(tableModel.getRowCount());
}
@Override
public int getRowCount() {
return 0;
}
@Override
public int getColumnCount() {
return 0;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
}
}数据库调用通过Hibernate获取数据,并将数据存储在。
谢谢你的帮助。
发布于 2020-04-29 22:17:52
在其最基本的形式中,JTable的表模型定义列、对象到列的映射,并保存供JTable调用的数据。如果我们采用您当前的表格模型,并将其削减以满足此基本需求,则会得到以下结果。
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class CategoryTableModel extends AbstractTableModel {
private final List<Category> tableData = new ArrayList<>();
public void add(Category cat) {
tableData.add(cat);
fireTableDataChanged();
}
@Override
public String getColumnName(int column) {
String result = "";
if (column == 0) {
result = "Category Name";
}
return result;
}
@Override
public int getRowCount() {
return tableData.size();
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return tableData.get(rowIndex).getName();
}
return null;
}
}请注意,我们没有在模型本身中定义任何数据。我们所定义的就是为数据和我们需要的单个列的列名定义一些存储空间。
我已经添加了一个add()方法,它允许您向模型中添加数据(您可能希望自己定义remove等)。在向模型添加数据或从模型中删除数据时,必须始终通过调用fireTableDataChanged()让JTable知道数据已经更改,以便表可以重新绘制自身。
要使用此表格模型,您需要执行以下操作
CategoryTableModel model = new CategoryTableModel();
model.add(new Category());
JTable table = new JTable(model);可以用循环替换model.add(),该循环遍历数据并将其添加到模型中。
https://stackoverflow.com/questions/61496997
复制相似问题