Hallo,
Ich bekomme es einfach nicht hin, mein JTable Model in eine XML-Datei zu sichern. Beim shcreiben gibt es folgende Exception:
java.lang.InstantiationException: table.test.Entry
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement Vector.add(Entry);
Continuing ...
java.lang.InstantiationException: table.test.Entry
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement Vector.add(Entry);
Continuing ...
Beim Laden gibts dann auch noch Fehler wegen der korrupten XML-Datei. Hier der Code:
ColumnModel
TableModel
Entry
MainFrame
Ich bekomme es einfach nicht hin, mein JTable Model in eine XML-Datei zu sichern. Beim shcreiben gibt es folgende Exception:
java.lang.InstantiationException: table.test.Entry
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement Vector.add(Entry);
Continuing ...
java.lang.InstantiationException: table.test.Entry
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement Vector.add(Entry);
Continuing ...
Beim Laden gibts dann auch noch Fehler wegen der korrupten XML-Datei. Hier der Code:
ColumnModel
Java:
package table.test;
import java.util.Vector;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;
public class ColumnModel extends DefaultTableColumnModel{
private Object[] columnData = new Object[]{
"Name", 100, //column 1: header value, width
"Art", 50, //column 2: header value, width
"Installiert", 50, //column 3: header value, width
};
public ColumnModel() {
for (int i = 0; i < columnData.length; i += 2) {
String title = (String) columnData[i];
Integer width = (Integer) columnData[i + 1];
TableColumn tableColumn = new TableColumn(i / 2, width);
tableColumn.setHeaderValue(title);
addColumn(tableColumn);
}
}
public Vector<TableColumn> getTableColumns() {
return tableColumns;
}
public void setTableColumns(Vector<TableColumn> tableColumns) {
this.tableColumns = tableColumns;
}
}
TableModel
Java:
package table.test;
import java.util.Vector;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
/**
*
* @author Nick
*/
public final class TableModel extends DefaultTableModel {
private Vector<Entry> data = null;
private Vector listeners = new Vector();
public TableModel() {
super(0, 4);
}
public void addMod(Entry ent) {
int index = data.size();
data.add(ent);
TableModelEvent e = new TableModelEvent( this, index, index,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT );
// Nun das Event verschicken
for( int i = 0, n = listeners.size(); i<n; i++ ){
((TableModelListener)listeners.get( i )).tableChanged( e );
}
}
public void removeRow(int row) {
data.remove(row);
fireTableRowsDeleted(row, row);
}
public void setRowCount(int i) {
getData().setSize(i);
}
public Vector<Entry> getData() {
if (data == null) {
data = new Vector<Entry>();
}
return data;
}
@Override
public String getColumnName(int col) {
switch(col) {
case 0:
return "Name";
case 1:
return "Art";
case 2:
return "Status";
default:
return null;
}
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public int getRowCount() {
return getData().size();
}
public Object getValueAt(int row, int col) {
Entry p = data.elementAt(row);
switch (col) {
case 0:
return p.getName();
case 1:
return p.getType();
case 2:
return p.getStatus();
default:
return null;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
/*Mod p = data.get(row);
switch (col) {
case 0:
p.setMod((String) value);
break;
case 1:
p.setStatus((boolean) value);
break;
}
fireTableCellUpdated(row, col);*/
}
@Override
public void addTableModelListener(TableModelListener l) {
listeners.add( l );
}
@Override
public void removeTableModelListener(TableModelListener l) {
listeners.remove( l );
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
public void setDataVector(Vector vector){
data = vector;
}
public Vector getColumnIdentifiers(){
return columnIdentifiers;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0) {
return Integer.class;
}
return String.class;
}
@Override
public Vector getDataVector() {
return data;
}
}
Entry
Java:
package table.test;
public final class Entry {
private String name = null;
private String type = null;
private boolean status = false;
public Entry(String pname, String ptype, boolean pstatus) {
this.name = pname;
this.status = pstatus;
this.type = ptype;
}
public String getName() {
return name;
}
public void setMod(String pname) {
this.name = pname;
}
public boolean getStatus() {
return status;
}
public void setStatus(boolean pstatus) {
this.status = pstatus;
}
public String getType() {
return type;
}
public void setType(String ptype) {
this.type = ptype;
}
}
MainFrame
Java:
package table.test;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
import javax.swing.*;
public class MainFrame extends JFrame{
private JButton btAddMod = new JButton();
private JScrollPane scpModScrollPane;
private JTable tblModTable = new JTable();
private static TableModel tableModel;
private static ColumnModel columnModel;
String modFile = "D:\\mods.xml";
int i = 1;
public static void main(String[]args) {
new MainFrame().show();
}
public MainFrame() {
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
btAddMod.setText("Eintrag hinzufügen");
tableModel = new TableModel();
columnModel = new ColumnModel();
scpModScrollPane = new JScrollPane(tblModTable);
loadTable();
tblModTable.setColumnModel(columnModel);
tblModTable.setModel(tableModel);
tableModel.addTableModelListener(tblModTable);
tblModTable.setShowGrid(false);
tblModTable.setRowHeight(tblModTable.getRowHeight() + 2);
tblModTable.setIntercellSpacing(new Dimension(0, 0));
tblModTable.setFillsViewportHeight(true);
tblModTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
btAddMod.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
i++;
addEntryToTable("Test" + i);
}
});
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent evt) {
saveTable();
dispose();
}
});
GroupLayout layout = new GroupLayout(getContentPane());
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(btAddMod))
.addGap(18, 18, 18)
.addComponent(scpModScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(240, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(btAddMod, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))
.addComponent(scpModScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(17, Short.MAX_VALUE))
);
}
public void saveTable() {
try {
XMLEncoder o = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(modFile)));
o.writeObject(columnModel);
o.writeObject(tableModel);
o.close();
JOptionPane.showMessageDialog(this, "Sequence saved.");
}
catch(Exception e){
System.out.println("Fehler beim Speichern");
e.printStackTrace();
}
}
private void loadTable() {
try{
XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream(modFile)));
columnModel = (ColumnModel) d.readObject();
tableModel = (TableModel) d.readObject();
d.close();
System.out.println("Geladen");
}
catch(Exception e){
System.out.println("Fehler beim Laden");
e.printStackTrace();
}
}
private void removeEntryFromTable(String mod) {
int pos = tblModTable.getSelectedRow();
tableModel.removeRow(pos);
}
private void addEntryToTable(String text) {
Entry mod = new Entry(text, "", false);
tableModel.addMod(mod);
}
}