Veröffentlicht 28. August 200025 j Moin, ich habe ein merkwürdiges Phänomen: In einer einspaltigen Tabelle kann per Button einen neuen Eintrag erstellen. Diesem Eintrag kann man dann direkt in der Liste einen Namen geben. Das ganze läuft ungefähr so: Dem Button habe ich einen ActionListener hinzugefügt myBtn.addActionListener(new ActionListener() { actionPerformed(ActionEvent e) { TableCellEditor newEditor = myTbl.getCellEditor(...) newEditor.addCellEditorListener(new CellEditorListener() { editingCanceled(ChangeEvent e){...} editingStopped(ChangeEvent e){...} }); } }); In dem editingStopped trage ich den neuen Eintrag in meinen Datenvector ein und aktualisiere das Datenmodell hinter der Tabelle (zwei verschieden Vectoren). Wenn ich während einer Prgorammsitzung einen neuen Eintrag hinzufüge, wird er beim ersten Mal 1x, beim zweiten Mal 2x usw. hinzugefügt. Er läuft auch entsprechend oft in die editingStopped hinein. Kann mir jemand erklären weshalb? fadi [Dieser Beitrag wurde von fadi am 28. August 2000 editiert.]
28. August 200025 j Problem gelöst Das folgende tut, was es tun soll. m_btnNew.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { materialListItem mliDummy = new materialListItem(); mliDummy.setName(szDummyEntry); int nPos = EngineManager.recorder.m_pnListe.addItem(mliDummy, -1); EngineManager.recorder.m_pnListe.updateTableModel(); EngineManager.recorder.m_pnListe.m_tblMaterial.setRowSelectionInterval (nPos , nPos); EngineManager.recorder.m_pnListe.myModel.setRowToEdit(nPos); boolean b = EngineManager.recorder.m_pnListe.m_tblMaterial.editCellAt(nPos, 0); Component comp = (Component)EngineManager.recorder.m_pnListe.m_tblMaterial.getEditorComponent(); ((JTextField)comp).selectAll(); ((JTextField)comp).setCaretPosition(szDummyEntry.length()); comp.requestFocus(); EngineManager.recorder.m_pnListe.m_tblMaterial.getCellEditor().addCellEditorListener(new CellEditorListener() { public void editingCanceled(ChangeEvent e) { //dev String szDebug = "editingCanceled"; String szDebugTitle = "Debug"; JOptionPane.showMessageDialog(null, szDebug, szDebugTitle, JOptionPane.INFORMATION_MESSAGE); //dev ende } public void editingStopped(ChangeEvent e) { int nRow = EngineManager.recorder.m_pnListe.m_tblMaterial.getEditingRow(); if (EngineManager.recorder.m_pnListe.myModel.isCellEditable(nRow, 0)) { EngineManager.recorder.m_pnListe.myModel.setRowToEdit(-1); TableCellEditor tblEditor = EngineManager.recorder.m_pnListe.m_tblMaterial.getCellEditor(); String szConfigKey = EngineManager.recorder.curConfig.getValidKey(); materialListItem mli = (materialListItem)EngineManager.recorder.m_pnListe.getItem(nRow); String szValue = (String)tblEditor.getCellEditorValue(); mli.setName(szValue); mli.setConfigKey(szConfigKey); EngineManager.recorder.m_pnListe.addItem(mli, nRow); EngineManager.recorder.m_pnListe.updateTableModel(); } }//editingStopped });//CellEditorListener }//actionPerformed });//ActionListener
29. August 200025 j @TG: Hab ja auch nie gesagt, daß es nicht geht, aber es ist superumständlich. Und alles nur, um im Look&Feel zu bleiben. I HATE IT! fadi
29. August 200025 j <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica">Zitat:</font><HR>Original erstellt von fadi: Problem gelöst m_btnNew.addActionListener(new ActionListener() {....
29. August 200025 j Meinst Du die erste öffnende runde Klammer zwischen addActionListener und new? m_btnNew.addActionListener(new ActionListener() { actionPerformed(ActionEvent e) { ... } }); Die wird ganz am Ende hinter der geschweiften Klammer geschlossen. Hab ich auch nur so aus den Sun-Tutorials übernommen. Gefressen hat's javac und läuft und läuft und läuft . Jetzt kommt die kontextsensitive Hilfe fadi [Dieser Beitrag wurde von fadi am 29. August 2000 editiert.]
29. August 200025 j <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica">Zitat:</font><HR>Original erstellt von fadi: Meinst Du die erste öffnende runde Klammer zwischen addActionListener und new? m_btnNew.addActionListener(new ActionListener() { actionPerformed(ActionEvent e) { ... } }); B]
29. August 200025 j Moin Uli, das ist ein ganz dreckiger Trick Es handelt sich um eine sogenannte anonyme Klasse. Dieser Codeauszug, denn ich gepostet habe, kommt aus dem Konstruktors meiner Klasse. Ich habe auch mehrere Class-Dateien, die aus der einen Java-Datei erzeugt werden. Mehr Infos dazu gibt es unter http://www.java.sun.com/docs/books/tutorial/java/javaOO/nested.html fadi
29. August 200025 j <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica">Zitat:</font><HR>Original erstellt von fadi: das ist ein ganz dreckiger Trick
29. August 200025 j Moin, stimmt, Du hast recht. Wie Du merkst, habe ich mit diesem Konzept und den dazugehörigen Begrifflichkeiten auch noch leichte Probleme. Die URL unten verweist auf eine Seite weiter im Sun-Tutorial, dort im unteren Teil gibt es einen Absatz über anonyme Klassen. http://www.java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html fadi
29. August 200025 j Hi nochmal, jau, den Abschnitt ueber anonyme Klassen hab ich spaeter noch entdeckt. Da steht dann auch, dass man die moeglichst sparsam verwenden sollte. Wie auch immer, ich werde nachher nochmal in meinen Unterlagen blaettern. Laesst mich irgendwie nicht ganz kalt, das Problemchen. Muss man wohl ganz haarklein aufschluesseln, damit es klar wird. ciao Uli ------------------ Uli's Prüfungspage ... die Seite mit den Prüfungshinweisen
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.