gpt4 book ai didi

java - 实例化后为空 TableModel

转载 作者:行者123 更新时间:2023-12-01 17:02:21 26 4
gpt4 key购买 nike

新手寻求帮助:-)

我正在开发一个小项目,以熟悉 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 获取数据并将数据存储在 .

感谢您的帮助。

最佳答案

JTable 的表模型最基本的形式定义了列、对象到列的映射,并保存 JTable 调用的数据。如果我们采用您当前的 table 模型并将其缩小以适应这一基本要求,我们会得到以下结果。

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() 方法,允许您向模型添加数据(您可能希望自己定义删除等)。当您在模型中添加或删除数据时,您必须始终通过调用 fireTableDataChanged() 让 JTable 知道数据已更改,以便表可以自行重绘。

要使用此表格模型,您需要执行以下操作

CategoryTableModel model = new CategoryTableModel();

model.add(new Category());

JTable table = new JTable(model);

您可以将 model.add() 替换为循环,迭代数据并将其添加到模型中。

关于java - 实例化后为空 TableModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61496997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com