Hi,
ich hänge gerade ziemlich an einer Stelle in meinem Programm.
Kurze Vorgeschichte: Ich bin Informatikstudent und als Semesterprojekt sollen wir ein Musikverwaltungs/abspielprogramm entwickeln.
Einige Dinge haben wir dafür schon im Laufe des Semesters bereitgestellt bekommen oder selbst entwickelt.
Wie zum Beispiel auch diese 3 Dateien:
sampeCDs.xml:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<cds>
<album freeDBId="e80d8910">
<title>Prince Charming</title>
<artist>Adam And The Ants</artist>
<genre>Pop</genre>
<year>1981</year>
<track>Scorpios</track>
<track>Picasso Vista el Planeta de los Simios</track>
<track>Prince Charming</track>
<track>Five Guns West</track>
<track>That Voodoo!</track>
<track>Stand and Deliver</track>
<track>Mile High Club</track>
<track>Ant Rap</track>
<track>Mowhok</track>
<track>S.E.X</track>
<track>Prince Charming (Demo)</track>
<track>Stand and Deliver (Demo)</track>
<track>Showbiz (Demo)</track>
<track>Picasso Visits the Planet of the Apes (Demo)</track>
<track>Who's a Goofy Bunny Then? (Demo)</track>
<track>Scorpio Writing (Demo)</track>
</album>
<album freeDBId="be0b310e">
<title>See Jungle! See Jungle! Go Join Your Gang Yeah, City All Over! Go Ape Crazy!</title>
<artist>Bow Wow Wow</artist>
<year>1982</year>
<genre>Rock</genre>
<track>Jungle Boy</track>
<track>Chihuahua (12" version)</track>
<track>Sinner, Sinner, Sinner (12" version)</track>
<track>Mickey Put It Down</track>
<track>(I'm a) TV Savage</track>
<track>Elimination Dancing</track>
<track>Golly! Golly! Go Buddy!</track>
<track>King Kong</track>
<track>Go Wild in the Country (12" version)</track>
<track>I Am Not a Know It All</track>
<track>Why Are Babies So Wise?</track>
<track>Orang-Outang</track>
<track>Hello, Hello Daddy (I'll Sacrifice You)</track>
<track>El Boss Dicho (12" version)</track>
</album>
</cds>[/XML]
TrackTableModel.java:
TrackTable.java:
Die XML Datei "soll" also mit dieser speziellen Tabelle dargestellt werden.
Das klappt auch soweit.
Mit
erstelle ich die Tabelle und setze sie dann auf ein Panel und dieses dann auf einen Frame. Klappt auch alles wunderbar.
Jetzt gibt es einen "Edit"-Button. Bei Klick auf selbigen wird ein neues Dialogfenster geöffnet mit diversen JTextFields, in denen jeweils der Inhalt der einzelnen Zellen der aktuell selektierten Reihe in der Tabelle angezeigt wird. Auch dies klappt. Ebenfalls befindet sich dort ein "Save"-Button, der die Änderungen dann vorerst nur mal im JTable übernehmen soll. Dafür habe ich in der Hauptklasse eine Stringvariable in der die Änderung gespeichert wird ("editedAlbum", nur fürs Album da erstmal testweise) und die nach Schließen des "Edit-Fensters" dann schließlich an der richtigen Stelle in der Tabelle gesetzt werden soll.
Dies alles geschieht in einer extra Klasse die ActionListener implementiert und die Tabelle im Konstruktor übergeben bekommt.
TableListener.java: (GUI ist die Hauptklasse)
In der Variable wird die Änderung auch gespeichert, wenn ich nach dem setValueAt allerdings für die selbe Zelle nochmal getValueAt aufrufe, ist von der Änderung nichts zu sehen.
Wie kann ich das ändern bzw wo liegt das Problem? Die auskommentierten Befehle repaint,updateUI und validate haben auch nicht geholfen. Bei Google habe ich schon einige Hilfestellungen gefunden, allerdings habe ich es nicht hinbekommen, diese an meinen Code anzupassen, da sich dort meist auf ein Standart JTable mit DefaultTableModel bezogen wurde.
Ich verzweifel da mittlerweile nun schon einige Stunden dran und habe schon einiges versucht doch nichts hat geholfen
Hoffentlich kann mir jemand weiterhelfen
Wenn noch weitere Codeteile benötigt werden, einfach Bescheid sagen!
Danke!
ich hänge gerade ziemlich an einer Stelle in meinem Programm.
Kurze Vorgeschichte: Ich bin Informatikstudent und als Semesterprojekt sollen wir ein Musikverwaltungs/abspielprogramm entwickeln.
Einige Dinge haben wir dafür schon im Laufe des Semesters bereitgestellt bekommen oder selbst entwickelt.
Wie zum Beispiel auch diese 3 Dateien:
sampeCDs.xml:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<cds>
<album freeDBId="e80d8910">
<title>Prince Charming</title>
<artist>Adam And The Ants</artist>
<genre>Pop</genre>
<year>1981</year>
<track>Scorpios</track>
<track>Picasso Vista el Planeta de los Simios</track>
<track>Prince Charming</track>
<track>Five Guns West</track>
<track>That Voodoo!</track>
<track>Stand and Deliver</track>
<track>Mile High Club</track>
<track>Ant Rap</track>
<track>Mowhok</track>
<track>S.E.X</track>
<track>Prince Charming (Demo)</track>
<track>Stand and Deliver (Demo)</track>
<track>Showbiz (Demo)</track>
<track>Picasso Visits the Planet of the Apes (Demo)</track>
<track>Who's a Goofy Bunny Then? (Demo)</track>
<track>Scorpio Writing (Demo)</track>
</album>
<album freeDBId="be0b310e">
<title>See Jungle! See Jungle! Go Join Your Gang Yeah, City All Over! Go Ape Crazy!</title>
<artist>Bow Wow Wow</artist>
<year>1982</year>
<genre>Rock</genre>
<track>Jungle Boy</track>
<track>Chihuahua (12" version)</track>
<track>Sinner, Sinner, Sinner (12" version)</track>
<track>Mickey Put It Down</track>
<track>(I'm a) TV Savage</track>
<track>Elimination Dancing</track>
<track>Golly! Golly! Go Buddy!</track>
<track>King Kong</track>
<track>Go Wild in the Country (12" version)</track>
<track>I Am Not a Know It All</track>
<track>Why Are Babies So Wise?</track>
<track>Orang-Outang</track>
<track>Hello, Hello Daddy (I'll Sacrifice You)</track>
<track>El Boss Dicho (12" version)</track>
</album>
</cds>[/XML]
TrackTableModel.java:
Java:
public class TrackTableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Track> tracks;
public List<Track> getTracks() {
return tracks;
}
public void setTracks(List<Track> tracks) {
this.tracks = tracks;
}
String[] columnNames={"Title","Year","Genre","Album","Artist"};
public TrackTableModel(List<Track> tracks) {
super();
this.tracks = tracks;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int i) {
return columnNames[i];
}
@Override
public int getRowCount() {
return tracks.size();
}
@Override
public Object getValueAt(int row, int column) {
Track track = tracks.get(row);
switch (column){
case 0: return track.getTitle();
case 1: return track.getYear();
case 2: return track.getGenre();
case 3: return track.getAlbum();
case 4: return track.getArtist();
}
return null;
}
@Override
public boolean isCellEditable(int arg0, int arg1) {
return true;
}
}
TrackTable.java:
Java:
public class TrackTable extends JTable {
private static final long serialVersionUID = 3415859692797332368L;
public TrackTable(List<Track> tracks) {
super(new TrackTableModel(tracks));
for (int i = 0; i < 5; i++) {
TableColumn column =this.getColumnModel().getColumn(i);
switch (i){
case 0:column.setPreferredWidth(150);break;
case 1:column.setPreferredWidth(40);break;
case 2:column.setPreferredWidth(60);break;
case 3:column.setPreferredWidth(150);break;
case 4:column.setPreferredWidth(150);break;
}
}
this.setAutoCreateRowSorter(true);
}
}
Die XML Datei "soll" also mit dieser speziellen Tabelle dargestellt werden.
Das klappt auch soweit.
Mit
Java:
Builder builder = BuilderFactory.newInstance().newBuilder();
Node dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("sampleCds.xml"));
List<Track> tracks = builder.fromDom(dom);
TrackTable table = new TrackTable(tracks);
Jetzt gibt es einen "Edit"-Button. Bei Klick auf selbigen wird ein neues Dialogfenster geöffnet mit diversen JTextFields, in denen jeweils der Inhalt der einzelnen Zellen der aktuell selektierten Reihe in der Tabelle angezeigt wird. Auch dies klappt. Ebenfalls befindet sich dort ein "Save"-Button, der die Änderungen dann vorerst nur mal im JTable übernehmen soll. Dafür habe ich in der Hauptklasse eine Stringvariable in der die Änderung gespeichert wird ("editedAlbum", nur fürs Album da erstmal testweise) und die nach Schließen des "Edit-Fensters" dann schließlich an der richtigen Stelle in der Tabelle gesetzt werden soll.
Dies alles geschieht in einer extra Klasse die ActionListener implementiert und die Tabelle im Konstruktor übergeben bekommt.
TableListener.java: (GUI ist die Hauptklasse)
Java:
public class TableListener implements ActionListener {
TrackTable tab;
JFrame fr;
GUI fenst;
public TableListener(TrackTable tabelle) {
tab = tabelle;
}
@Override
public void actionPerformed(ActionEvent arg0) {
String utitle = ""+tab.getValueAt(tab.getSelectedRow(), 0);
String uyear = ""+tab.getValueAt(tab.getSelectedRow(), 1);
String ugenre = ""+tab.getValueAt(tab.getSelectedRow(), 2);
String ualbum = ""+tab.getValueAt(tab.getSelectedRow(), 3);
String uartist = ""+tab.getValueAt(tab.getSelectedRow(), 4);
JDialog editwind = new EditWindow(fr, fenst, utitle, uyear,ugenre,ualbum,uartist);
System.out.println(fenst.editedAlbum);
tab.setValueAt(fenst.editedAlbum, tab.getSelectedRow(), 3);
System.out.println(tab.getValueAt(tab.getSelectedRow(), 3));
// tab.repaint();
// tab.updateUI();
// tab.validate();
}
}
In der Variable wird die Änderung auch gespeichert, wenn ich nach dem setValueAt allerdings für die selbe Zelle nochmal getValueAt aufrufe, ist von der Änderung nichts zu sehen.
Wie kann ich das ändern bzw wo liegt das Problem? Die auskommentierten Befehle repaint,updateUI und validate haben auch nicht geholfen. Bei Google habe ich schon einige Hilfestellungen gefunden, allerdings habe ich es nicht hinbekommen, diese an meinen Code anzupassen, da sich dort meist auf ein Standart JTable mit DefaultTableModel bezogen wurde.
Ich verzweifel da mittlerweile nun schon einige Stunden dran und habe schon einiges versucht doch nichts hat geholfen
Hoffentlich kann mir jemand weiterhelfen
Danke!