![](/img/trans.png)
[英]How to set TableModel as DataSource in an empty iReport (NetBeans 7.1)
[英]empty TableModel after instantiating
新手求幫助:-)
我正在做一個小項目來熟悉 Java 桌面開發和數據庫連接。
附加代碼在實例化后給了我一個空的 TableModel,因此 JFrame 中沒有顯示數據。 測試 class 使用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 獲取數據並將數據存儲在 a.
感謝幫助。
In its most basic form a table model for a JTable defines the columns, the mapping of object to column and holds the data for the JTable to call upon. 如果我們采用您當前的表 model 並將其縮減以適應此基本要求,我們將得到以下結果。
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;
}
}
請注意,我們沒有在 model 本身中定義任何數據。 我們定義的只是一些數據存儲和我們需要的單列的列名。
我添加了一個 add() 方法,允許您將數據添加到 model(您可能希望自己定義刪除等)。 當您從 model 添加或刪除數據時,您必須始終讓 JTable 通過調用 fireTableDataChanged() 知道數據已更改,以便表可以重繪自身。
要使用這個表 model 你需要做
CategoryTableModel model = new CategoryTableModel();
model.add(new Category());
JTable table = new JTable(model);
您可以將 model.add() 替換為循環遍歷數據並將其添加到 model 的循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.