jTable / Zelle auswählen via Code

Status
Nicht offen für weitere Antworten.

dhachim

Bekanntes Mitglied
Ich möchte Tabellenwerte, die eingetragen wurden, in einen Vector einlesen. Das Problem ist aber, dass die letzte Zelle verlassen werden muss, bevor der User "SEND" betätigt.
Die active Zelle wird als "" gelesen, da der Eintrag noch nicht abgelegt wurde.

Meine Idee ist, per Code Befehl die Zelle 0,0 zu aktivieren, oder ein ENTER zu simulieren. Leider habe ich weder in der API, noch im Forum eine Lösung gefunden.

Ich will einfach diesen Userfehler abfangen.

Danke schonmals

Grüße Daniel Hachim
 
Wenn der User deinen Senden-Button betätigt wird die zuletzt editierte Zelle durch den oben genannten Befehl als "fertig bearbeitet" markiert und somit der Wert darin abgelegt.

Oder willst du was anderes und ich hab dich falsch verstanden?
 
JTable.getCellEditor().stopCellEditing()

Vorher nachschauen ob nicht null!

Sollte normalerweise der defaultCellEditor sein!


ggf, kann man das auch via JTable.getCellEditor(getSelectedRow(),getSelectedColumn()) falls du bei verschiedenen Zeilen verschiedene Editoren hast!
 
hmmm ich komme erst jetzt dazu es zu testen, und habe da noch meine Probleme mit.

Ich möchte dass der Cursor, der noch auf der aktuellen Zelle gesetzt ist, umgesetzt wird, da wenn ich per getValueAt() sonst den Inhalt nicht bekomme.
Den Cell Editor versteh ich nicht. wenn ich deinen Befehl absetze, bekomme ich ne nullpointerexception an dieser Stelle.

Vielleicht kann hier jemand nen BeispielCode posten, und mir vielleicht was dazu erklären, vor allem was es sich mit diesen celleditor auf sich hat.

Danke
 
--> table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
das müsste eigentlich damit funktionieren:
Code:
/*
 * TableSendDemo.java
 */
package table;

import javax.swing.*;
import javax.swing.table.*;
public class TableSendDemo extends JFrame {
    public TableSendDemo() {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        
        table = new JTable();
        toolbar = new JToolBar();
        btSend = new JButton();
        
        table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        table.setModel(new DefaultTableModel(
                new Object [][] {
                    {null}, {null}, {null}, {null}
        },
                new String [] { "Title 1" }
        ));
        getContentPane().add(new JScrollPane(table), java.awt.BorderLayout.CENTER);
        btSend.setText("Send");
        btSend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                send();
            }
        });
        toolbar.add(btSend);
        getContentPane().add(toolbar, java.awt.BorderLayout.NORTH);
    }
    private void send(){
        Object value;
        for (int i = 0; i < table.getRowCount(); i++) {
            value = table.getValueAt(i,0);
            if(value != null){
                System.out.println(value);
            }
        }
    }
    public static void main(String args[]) {new TableSendDemo().setVisible(true);}
    private JButton btSend;
    private JTable table;
    private JToolBar toolbar;
}
 
okay dann nochmals danke an den Hobbit und dich André. Ich habe keinen blassen schimmer warum das jetzt tut und letztens nicht. Sehr seltsam.

Code:
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

Was genau macht dieser Aufruf ? So wie ich das sehe wird hier in einer Hashmap ein Paar angelegt (Key/value), aber ich rufe diesen doch niemals auf. Ich habe nur diese Zeile in meine Senden Methode gestellt und schon macht es das was es soll.

Oder ist "terminateEditOnFocusLost" schon ein angelegter schlüssel ? der mit true aktiviert wird ? Wenn ja, wo stehen diese Befehle oder Methoden ? Muss man die kennen, oder wie kommt man da drauf ?
Hoffe mir bringt jem,and Licht ins Dunkel, denn in der API steht
Adds an arbitrary key/value "client property" to this component.

Verstehe es also nicht !

Danke schonmal

Grüße dhachim
 
"terminateEditOnFocusLost" ist eine Property die in Jtable schon fest eingebaut ist
und nur darauf wartet, aktiviert zu werden. Leider habe ich keine weiteren Informationen
dazu, da diese Art Properties [noch] nirgends dokumentiert sind.
Dies ist gewissermassen ein Insider Tipp.
 
Die Properties gehören AFAIK nicht zur public API. So SUN will werden sie in Zukunft vermutlich einige der Properties rausgreifen und Methoden dafür anbieten.
 
Wildcard hat gesagt.:
Die Properties gehören AFAIK nicht zur public API.
So SUN will werden sie in Zukunft vermutlich einige der Properties rausgreifen und Methoden dafür anbieten.
Richtig, und rein theoretisch könnte dann Sun die Properties auch wieder wegnehmen, ist ja keine public API.
Im vorliegenden Fall ist das aber eher unwahrscheinlich.
 
hehe gut dass ihr das erwähnt, dann weiss ich wo ich suchen muss, wobei hier bei mir im Betrieb es eher unwahrscheinlich ist, dass ich in allzunaher Zukunfgt ne neue Java Version bekomme. Darf noch mit Java 1.4.x arbeiten.
 
Oh mann ich könnte heulen. Heute funktioniert das ganze wieder nicht. Am Code geändert hab ich an der Stelle nichts. Sehr komisch.

Es wäre echt fatal wenn der User beim speichern in der Datenbank, diesen markierten Wert nicht mitsendet, und das auch nicht merkt

Gibt es noch einen anderen Weg ?



[EDIT] Sorry, aber ich habe es nun gelöst. FocusLost event auf der Tabelle Hilft in meinem Fall . Kann es sein, dass dieser Aufruf nur auf eine Aktive Komponente funktioniert. Habe es gerade in einer Testklasse versucht, und auf einen Button gelegt, und da klappte es auch nicht.[/EDIT]

[EDIT 2] Das kann doch nicht wahr sein. Das Ding funktioniert n paar mal, dann wieder nicht, dann wieder. Echt seltsam🙂 [/EDIT 2]

[EDIT 3] Ich hasse Montage 🙂 Wenn man die Methode einfach schon beim erzeugen der Tabelle aufruft, dann klappts auch. Nix Listener, nix auf Buttons legen einfach dazufügen und gut ist 🙂[/EDIT 3]
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben