我有一个AbstractTableModel
的子类和一个JFrame
来显示我的表中的数据,跑过来,出现的唯一错误而不是列名出现A,B,C
我做错了什么?
这是我的课程
package Biblioteca;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class TabelaAlunos extends AbstractTableModel {
private ArrayList linhas = null;
private String[] colunas = {"id_aluno", "nome_aluno", "matricula", "telefone", "email", "sexo"};
public TabelaAlunos(ArrayList lin, String[] col) {
setColunas(col);
setLinhas(lin);
}
public ArrayList getLinhas() {
return linhas;
}
public void setLinhas(ArrayList dados) {
linhas = dados;
}
public String[] getColunas() {
return colunas;
}
public void setColunas(String[] nomes) {
colunas = nomes;
}
@Override
public int getColumnCount() {
return colunas.length;
}
@Override
public int getRowCount() {
return linhas.size();
}
@Override
public String getColumnName(int columnIndex) {
return colunas[columnIndex];
}
@Override
public Object getValueAt(int numLin, int columnIndex) {
Object[] linha = (Object[]) getLinhas().get(numLin);
return linha[columnIndex];
}
};
答案 0 :(得分:2)
此方法存在拼写错误:
public String getColomnName(int numCol) {
return colunas[numCol];
}
它应该是(注意 u 而不是 o ):
@Override
public String getColumnName(int numCol) {
return colunas[numCol];
}
这就是当我们进行子类化和重写方法时@Override
注释很重要的原因。如果在实际代码中包含此注释,则不应编译,因为父类中未定义getColomnName(...)
。
同样的原则适用于所有这些方法:
getColumnCount()
getRowCount()
getValueAt(int row, int column)
根据您的更新,您的桌面模型看起来很好。我使用你的桌面模型制作了一个MCVE,它都按预期工作。看看问题' third revision,您不能使用TabelaAlunos
表格模型,而是使用TabelaLivros
,因此问题可能出在该表格模型中。
您还可以考虑使用POJO包装数据来建模业务数据并实现表格模型,例如示例here。展示了here和here的高级替代品。另请参阅Rob Camick的Table From Database。
最后,请看下面的例子:
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class Demo {
private void createAndShowGUI() {
String[] header = {"id_aluno", "nome_aluno", "matricula", "telefone", "email", "sexo"};
ArrayList<Object[]> data = new ArrayList<>();
data.add(new Object[] {1, "Fernando", "1234567890", "1234-567890", "email@example.com", "M"});
TableModel model = new TabelaAlunos(data, header);
JTable table = new JTable(model);
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
public class TabelaAlunos extends AbstractTableModel {
private ArrayList linhas;
private String[] colunas;
public TabelaAlunos(ArrayList lin, String[] col) {
setColunas(col);
setLinhas(lin);
}
public ArrayList getLinhas() {
return linhas;
}
public void setLinhas(ArrayList dados) {
linhas = dados;
}
public String[] getColunas() {
return colunas;
}
public void setColunas(String[] nomes) {
colunas = nomes;
}
@Override
public int getColumnCount() {
return colunas.length;
}
@Override
public int getRowCount() {
return linhas.size();
}
@Override
public String getColumnName(int columnIndex) {
return colunas[columnIndex];
}
@Override
public Object getValueAt(int numLin, int columnIndex) {
Object[] linha = (Object[]) getLinhas().get(numLin);
return linha[columnIndex];
}
}
}