我正在使用我自己的TableModel构建一个Swing-Gui并在JScrollPane中有一个JTable对象。模型核是包含数据的LinkList。我这样做是因为LinkedList能够随时插入行作为Object []而无需替换2D数组。我写了一个方法,在我的LinkedList中插入一个Object [],但我不能通过调用main方法中的TableModel从JTable调用它,我不知道为什么。有人有想法吗?
public class TableModel extends AbstractTableModel {
String[] columnNames = { "Kundennummer","Firma","Nachname","Vorname","Telefonnummer","Emailadresse","Adresszeile 1","Adresszeile 2", "PLZ", "Ort", "Geburtsdatum"};
int anzahlAttribute = 11;
LinkedList<Object[]> data;
public TableModel(LinkedList<Object[]> rows){
this.data = rows;
}
@Override
public String getColumnName(int col) {
return columnNames[col].toString();
}
/**
* @see javax.swing.table.TableModel#getColumnCount()
*/
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return columnNames.length;
}
/**
* @see javax.swing.table.TableModel#getRowCount()
*/
@Override
public int getRowCount() {
// TODO Auto-generated method stub
return data.size();
}
/**
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
@Override
public Object getValueAt(int arg0, int arg1) {
// TODO Auto-generated method stub
try{
return data.get(arg0)[arg1];
}catch(ArrayIndexOutOfBoundsException e){
return "";
}
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public void setValueAt( Object val, int row, int column ){
data.get(row)[column] = val;
this.fireTableDataChanged();
}
public void insertRow(Object[] rowData){
this.data.add(rowData);
this.fireTableRowsInserted(data.size()-1, data.size()-1);
}
public class PaneCenter extends JScrollPane implements Panelsetter {
private static PaneCenter c;
private static JTable kundenTabelle;
private TableModel tm;
private PaneCenter(){
super();
}
/**@ Constructor
*
*
*
*
*@param arg0
*/
public PaneCenter(Component arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public static PaneCenter getInstance(){
if(c == null){
c = new PaneCenter(kundenTabelle = new JTable());
}
return c;
}
public void setPanel(LinkedList<Object[]> data){
c.setBackground(Color.GRAY);
c.setBorder(new LineBorder(Color.black));
c.setPreferredSize(new Dimension(500,350));
c.setMinimumSize(new Dimension(500,350));
c.setMaximumSize(new Dimension(500,350));
kundenTabelle.setModel(tm = new TableModel(data));
kundenTabelle.setAutoResizeMode(0);
kundenTabelle.setSelectionMode(0);
}
public JTable getKundenTabelle() {
return kundenTabelle;
}
public TableModel getTableModel(){
return tm;
}
/**
* @see interfaces.Panelsetter#setPanel()
*/
@Override
public void setPanel() {
// TODO Auto-generated method stub
}
public class Run {
public static void main(String[] args) {
// TODO Auto-generated method stub
Object[] aa = {"1", "2", "3", "4", "5", "1", "2", "3", "4", "5", "11"}
PaneCenter.getInstance().setPanel(Bank.getCustomerDataArray())
PaneCenter.getInstance().getKundenTabelle().getModel().insertRow(aa);
Frame.getInstance().addPanels(PaneCenter.getInstance());
Frame.getInstance().setVisible(true);
}
}
答案 0 :(得分:0)
我之所以这样做,因为LinkedList可以随时插入行作为Object [],而无需替换2D数组
您不需要自定义表格模型。只需使用DefaultTableModel
即可。 DefaultTableModel将数据从2D数组复制到Vector of Vector。
然后,您可以使用insertRow(...)
方法在模型中的任何位置插入一行数据。
我无法通过调用main-method
中的TableModel从JTable中调用它
你真的不应该尝试从main()方法调用它。主要方法应该是创建框架并向框架添加面板。创建框架的代码应负责将数据添加到表模型中。
其他评论:
不要扩展JScrollPane。您尚未更改滚动面板的功能。因此,只需创建一个滚动窗格的实例并将面板添加到其中。
变量名称不应以大写字母开头。
不要在班级中使用静态变量。
查看How to Use Tables上Swing教程中的演示代码,了解如何更好地构建代码以解决主要问题以及所有其他较小问题的示例。
这是一项大学任务,它说“......使用抽象数据模型......”
然后你通常会使用一个ArrayList来保存数据,你可以直接插入到你想要的地方。