M
martin2002
Gast
Hi...
ich habe das problem, dass die grafik nicht aktualisiert wird, wenn ich (component).updateUI() aus einer methode aufrufe (die gerade verarbeitet wird). Ich habe in einem anderen Forum aufgeschnappt, dass das u.a. dann auftritt, wenn ich die betreffende methode aus dem event dispatch thread aufrufe...
In meinem fall mache ich das mit einem ActionListener an einem JMenuItem.
da die grafik wohl auch aus diesem thread heraus aktualisiert wird ist dieser dann belegt und kann das nicht machen...
die frage ist jetzt, wie ich das umgehen bzw. lösen kann? ich habe schon versucht die verarbeitung aus extra threads auszuführen (nach dem beispiel folgender seite: http://www.codecomments.com/archive250-2004-12-335240.html - vorletzter post) -> ging aber auch nicht, da hat sich auch nichts gerührt oder ich hab was falsch gemacht.
so mal noch allgemein um was für ein programm es sich dreht... ich programmiere ein kleines tool zur visualisierung von suchbäumen und den operationen (einfügen, löschen, suchen). die einzelschritte sollen immer angezeigt werden und deshalb muss während dem verarbeiten dieses update gemacht werden... ist ne aufgabe fürn unterricht :wink:
hier mal der programmcode der die löschen-methode aufruft:
die methode TreePanel.deleteNode():
der code der in die blöcke "if (actPane.isVisu())" eingeschlossen ist soll die grafikupdates auslösen, nachdem er verschiedenes vorbereitet hat...
ich wär euch echt dankbar, wenn ihr mir damit schnell helfen könntet
thx
martin
ich habe das problem, dass die grafik nicht aktualisiert wird, wenn ich (component).updateUI() aus einer methode aufrufe (die gerade verarbeitet wird). Ich habe in einem anderen Forum aufgeschnappt, dass das u.a. dann auftritt, wenn ich die betreffende methode aus dem event dispatch thread aufrufe...
In meinem fall mache ich das mit einem ActionListener an einem JMenuItem.
da die grafik wohl auch aus diesem thread heraus aktualisiert wird ist dieser dann belegt und kann das nicht machen...
die frage ist jetzt, wie ich das umgehen bzw. lösen kann? ich habe schon versucht die verarbeitung aus extra threads auszuführen (nach dem beispiel folgender seite: http://www.codecomments.com/archive250-2004-12-335240.html - vorletzter post) -> ging aber auch nicht, da hat sich auch nichts gerührt oder ich hab was falsch gemacht.
so mal noch allgemein um was für ein programm es sich dreht... ich programmiere ein kleines tool zur visualisierung von suchbäumen und den operationen (einfügen, löschen, suchen). die einzelschritte sollen immer angezeigt werden und deshalb muss während dem verarbeiten dieses update gemacht werden... ist ne aufgabe fürn unterricht :wink:
hier mal der programmcode der die löschen-methode aufruft:
Code:
JMenuItem mnuNodeDel = new JMenuItem("Löschen");
mnuNodeDel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (_selNode == null) return;
if (JOptionPane.showConfirmDialog(treePane,"Soll der Knoten wirklich gelöscht werden?", "Löschen", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) return;
treePane.deleteNode(_selNode); // <-- hier der aufruf
// treePane ist eine extra klasse TreePanel (von JPanel geerbt)... in ihr werden die knoten dargestellt. treePane hat ein null-layout gesetzt.
treePane.setPreferredSize(new Dimension(350,150));
getTreePane().setSize(getTreePane().getPreferredSize());
treePane.updatePosition(treePane.getTreeRoot());
treePane.updateUI();
}
});
die methode TreePanel.deleteNode():
Code:
public void deleteNode(NodeGUI item) {
NodeGUI tmpNodeL = getTreeRoot().getLChild();
NodeGUI tmpNodeR = getTreeRoot().getRChild();
if (item.getParentNode() == null) { // delete Root
if (tmpNodeL != null)
tmpNodeL.setParentNode(null);
if (tmpNodeR != null)
tmpNodeR.setParentNode(null);
if (actPane != null) {
actPane.setActionText("Lösche Wurzel");
actPane.updateUI();
actPane.txtAction.updateUI();
if (actPane.isVisu()) {
if (tmpNodeL != null)
tmpNodeL.setRelativeRoot(true);
if (tmpNodeR != null)
tmpNodeR.setRelativeRoot(true);
item.setLChild(null);
item.setRChild(null);
updateUI();
paintNodeLines(getGraphics(), getTreeRoot());
paintNodeLines(getGraphics(), tmpNodeL);
paintNodeLines(getGraphics(), tmpNodeR);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() <= now+1000) continue;
}
}
if (tmpNodeL == null) {
if (actPane != null && actPane.isVisu() && tmpNodeR != null) {
remove(getTreeRoot());
tmpNodeR.setRelativeRoot(false);
updatePosition(tmpNodeR,true);
updateUI();
paintNodeLines(getGraphics(), tmpNodeR);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() <= now+1000) continue;
}
setTreeRoot(tmpNodeR);
} else {
if (actPane != null && actPane.isVisu()) {
remove(getTreeRoot());
tmpNodeL.setRelativeRoot(false);
updatePosition(tmpNodeL,true);
updateUI();
paintNodeLines(getGraphics(), tmpNodeR);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() <= now+1000) continue;
}
setTreeRoot(addNode(getTreeRoot(), item.getRChild()));
}
} else {
if (actPane != null) {
actPane.setActionText("Löschen:\n\nHerauslösen des Elements '"+item.getText()+"'");
actPane.updateUI();
actPane.txtAction.updateUI();
}
if (item.getParentNode().getLChild() == item) {
item.getParentNode().setLChild(null);
} else if (item.getParentNode().getRChild() == item) {
item.getParentNode().setRChild(null);
}
item.setParentNode(null);
if (actPane != null && actPane.isVisu()) {
updateUI();
item.setRelativeRoot(true);
paintNodeLines(getGraphics(), getTreeRoot());
paintNodeLines(getGraphics(), item);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() <= now+1000) continue;
}
if (item.getLChild() != null) {
if (actPane != null) {
actPane.setActionText("Löschen:\n\nWiedereinfügen des linken Nachfolgers");
actPane.updateUI();
actPane.txtAction.updateUI();
if (actPane.isVisu()) {
item.getLChild().setActive(true);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() <= now+1000) continue;
}
}
setTreeRoot(addNode(getTreeRoot(), item.getLChild()));
if (actPane != null && actPane.isVisu()) {
item.getLChild().setActive(false);
}
}
if (item.getRChild() != null) {
if (actPane != null) {
actPane.setActionText("Löschen:\n\nWiedereinfügen des rechten Nachfolgers");
actPane.updateUI();
actPane.txtAction.updateUI();
if (actPane.isVisu()) {
item.getRChild().setActive(true);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() <= now+1000) continue;
}
}
setTreeRoot(addNode(getTreeRoot(), item.getRChild()));
if (actPane != null && actPane.isVisu()) {
item.getRChild().setActive(false);
}
}
}
this.remove(item);
item = null;
}
der code der in die blöcke "if (actPane.isVisu())" eingeschlossen ist soll die grafikupdates auslösen, nachdem er verschiedenes vorbereitet hat...
ich wär euch echt dankbar, wenn ihr mir damit schnell helfen könntet
thx
martin