setValueAT geht nicht... wieso?

LexeB4F

Mitglied
Hallo zusammen,

Ich bin gerade echt verwirrt.... bitte schaut Euch dies mal an:

Java:
table.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                int x = e.getKeyChar();
                System.out.println(x);
               
               
                if (x == 127) {
                    System.out.println("DEL");
                    System.out.println(table.getValueAt(table.getSelectedRow(), table.getSelectedColumn()));
                    table.setValueAt("20", 1, 1);                            //dieser Value wird gesetzt
                    int row = table.getSelectedRow();
                    int col = table.getSelectedColumn();
                    table.setValueAt("20", row, col);                    // dieser nicht
                    System.out.println(table.getSelectedRow() + " " + table.getSelectedColumn());
                   
                }

                // TODO Auto-generated method stub

            }

            @Override
            public void keyReleased(KeyEvent e) {
                // TODO Auto-generated method stub

            }

            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub

            }
        });

Ich versteh nicht wieso der zweite Value nicht gesetzt wird...

System.out.println(table.getSelectedRow() + " " + table.getSelectedColumn());
wird schön ausgegeben....

Bitte helft mir auf die Sprünge an was es liegt!
Danke
 

Joose

Top Contributor
Kann es sein das "row" und "col" jeweils den Wert 1 haben?
Du kannst dir per getValue auch den Wert der Zelle ausgeben. Möglicherweise wird der Wert gesetzt aber die UI nicht neu gezeichnet.
 

LexeB4F

Mitglied
Nein raw und col werden dann ja mit Sys.out.pl angezeigt ...sie sind nicht 1,1. Kann es ev. sein, dass es nicht geht weil die Zelle selected ist?
Ausgabe der selected Zelle habe ich gerade geprüft ist der alte Wert.
 

Meniskusschaden

Top Contributor
Ich vermute, es liegt daran, dass die Tabelle eine eigene Ereignisbehandlung enthält, die auf die DEL-Taste reagiert und die selektierte Zelle dadurch blockiert. Vielleicht hilft es, mit e.consume() in der keyPressed-Methode das Ereignis abzufangen.
 

LexeB4F

Mitglied
Damit der Thread komplett und gelöst ist...
Im erste Post konnte das nix werden, da:
if (x == 127){
x= e.getKeyChar() --> wird nie 127 sein...

Doch an dem alleine lag es leider nicht...

Nach langem versuchen habe ich es rausgefunden wie es funktioniert.

Java:
table.addKeyListener(new KeyListener() {
                ;
                @Override
                public void keyPressed(KeyEvent e) {
                             
                if (e.getKeyCode() == 127){
                    col1 = table.getSelectedColumn();
                    row1 = table.getSelectedRow();
                    table.setValueAt("", row1, col1);
                }
                 
                }
             
                @Override
                public void keyTyped(KeyEvent e) {
                 
                }
             
                @Override
                public void keyReleased(KeyEvent e) {
                 
                }
            });

Als ich diesen KeyListener in den TableCellRenderer gesteckt habe... unter if (hasFocus){...

hats nun endlich geklappt...

Leider verstehe ich immer noch nicht wieso ich den KeyListener in den if (hasFocus) {
teil packen muss... der sollte doch auch wo anders funktionieren...

Also wenn jemand mir da auf die Sprünge helfen kann... wär ich froh.

LG
Lexe
 

Meniskusschaden

Top Contributor
Im erste Post konnte das nix werden, da:
if (x == 127){
x= e.getKeyChar() --> wird nie 127 sein...
Die Bemerkung verstehe ich nicht. Dieser Code kommt im ersten Post doch gar nicht vor, oder habe ich da etwas übersehen.

Als ich diesen KeyListener in den TableCellRenderer gesteckt habe... unter if (hasFocus){...

hats nun endlich geklappt...

Leider verstehe ich immer noch nicht wieso ich den KeyListener in den if (hasFocus) {
teil packen muss... der sollte doch auch wo anders funktionieren...
Mir ist nicht klar, was du bzgl. TableCellRenderer und hasFocus gemacht hast. Ich glaube, damit hat es nichts zu tun, sondern der entscheidende Unterschied ist, dass du deine Routine von der Methode keyTyped in die Methode keyPressed verlegt hast, die zeitlich vor keyTyped ausgeführt wird und offenbar dem in meinem vorigen Post vermuteten Konflikt mit der Standardereignisbehandlung zuvorkommt.

Ich habe den Vorschlag aus meinem vorigen Post jetzt interessehalber auch mal getestet (e.consume() in keyPressed-Methode einfügen). Dann funktioniert bereits der Code aus deinem ersten Post.
 

LexeB4F

Mitglied
Danke für die Antwort.

Diesen Abschnitt habe ich gemeint:

int x = e.getKeyChar();
System.out.println(x);


if (x == 127) {
System.out.println("DEL");


Danke für den Hinweis mit keytyped und keyPressed habe ich selber gar nicht bemerkt...
Jetzt weiss ich erst recht nicht mehr an was es lag, dass es zuerst nicht geklappt hat :p

Das mit e.consume() habe ich selber nicht hinbekommen.
Wenn du den codeAbschnit postest würde ich mir deine Lösung gerne ansehen.
 

Meniskusschaden

Top Contributor
Das ist noch einmal dein ursprünglicher Code aus dem ersten Post, in dem ich als einzige Änderung ganz hinten e.consume() hinzugefügt habe:
Java:
table.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                int x = e.getKeyChar();
                System.out.println(x);
                              
                if (x == 127) {
                    System.out.println("DEL");
                    System.out.println(table.getValueAt(table.getSelectedRow(), table.getSelectedColumn()));
                    table.setValueAt("20", 1, 1);                            //dieser Value wird gesetzt
                    int row = table.getSelectedRow();
                    int col = table.getSelectedColumn();
                    table.setValueAt("20", row, col);                    // dieser nicht
                    System.out.println(table.getSelectedRow() + " " + table.getSelectedColumn()); 
                }

            }

            @Override
            public void keyReleased(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
                e.consume();
            }
        });
Falls du keinen besonderen Grund hattest, es in keyType zu realisieren kannst du es natürlich auch im keyPressed belassen. Dann ist e.consume() überflüssig.
 

LexeB4F

Mitglied
Ich hab dies bereits nachgeschlagen, jedoch verstehe ich es nicht ganz...
keyPressed wird einfach nicht ausgeführt? Richtig?

Aber wieso bringt e.consum(); meinen Code zum laufen!?
 

Meniskusschaden

Top Contributor
Es ist vielleicht ganz hilfreich, zunächst mit folgendem Code etwas herum zu spielen:
Java:
    table.addKeyListener(new KeyListener() {
  
       @Override
       public void keyPressed(KeyEvent e) {
         System.out.println("keyPressed");
       }

       @Override
       public void keyReleased(KeyEvent e) {
         System.out.println("keyReleased");  
       }

       @Override
       public void keyTyped(KeyEvent e) {
         System.out.println("keyTyped");    
       }

  });
Wenn man damit ein paar Tasten ausprobiert (Buchstaben, Funktionstasten, NumLock, etc.; mal kurz drücken, mal festhalten) bekommt man ein Gefühl, welche Ereignisse ausgelöst werden und in welcher Reihenfolge das geschieht.

Wenn alle drei Ereignisse ausgelöst werden, passiert es in der folgenden Reihenfolge:
keyPressed
keyTyped
keyReleased

Die Vermutung ist ja, dass es zunächst nicht funktioniert hat, weil deine Routine die selektierte Zelle manipulieren soll (andere Zellen konnte sie ja ändern) und dass das durch das Standardverhalten der Komponente verhindert wird, die ja wahrscheinlich auch etwas tut, sobald man eine Taste in der selektierten Zelle drückt. Mittels der consume()-Methode wird die Eigenschaft consumed des Ereignisses auf true gesetzt. Die Komponente ist offenbar so programmiert, dass sie ihre Standardbehandlung nur für nicht konsumierte Ereignisse durchführt.

Wir müssen also dafür sorgen, dass consume() rechtzeitig aufgerufen wird, um das Standardverhalten zu unterbinden. Deshalb tun wir das in der keyPressed-Methode, denn in der keyTyped-Methode wäre es schon zu spät.

consume() verhindert nicht, dass die Ereignisbehandlung aufgerufen wird, aber der Programmierer der Ereignisbehandlung kann den Aufruf von consume() respektieren. In folgendem Beispiel werden für keyPressed und keyReleased je zwei Lsitener registriert, wobei die ersten consume() aufrufen. Der zweite keyPressed ignoriert consume(), der zweite keyReleased respektiert es:

Java:
    table.addKeyListener(new KeyListener() {
     
       @Override
       public void keyPressed(KeyEvent e) {
         e.consume();
         System.out.println("keyPressed 1");
       }

       @Override
       public void keyReleased(KeyEvent e) {
         e.consume();
         System.out.println("keyReleased 1");     
       }

  });
     
     table.addKeyListener(new KeyListener() {
       
       @Override
       public void keyPressed(KeyEvent e) {
         System.out.println("keyPressed 2");
       }

       @Override
       public void keyReleased(KeyEvent e) {
         if (!e.isConsumed()) {
           System.out.println("keyReleased 2");
         }
       }

  });
 

LexeB4F

Mitglied
Danke für die ausführliche Antwort! Begriffen habe ich es noch nicht ganz aber werde mal etwas mit e.consum rumspielen und es versuchen zu verstehen wie genau wann was wie wo geht im keylistener ;)
 

Joose

Top Contributor
Begriffen habe ich es noch nicht ganz ....

Hier eine andere Darstellung (von consume): Stelle dir 2 Arbeiter (Listener) an einem Fließband vor. Der eine Arbeiter ist von dir eingeschult (programmiert) worden vorbeifahrende Geschenke (Event) einzupacken und mit einer Masche zu versehen (sie zu konsumieren), wenn sie nicht schwerer als 1kg sind. Der andere Arbeiter soll die Geschenke auspacken, aber nur wenn keine Masche auf dem Geschenk ist.

Sprich mit "consume" kannst du sagen das Event wurde bereits von einem Listener verarbeitet. Alle Listener können prüfen ob es verarbeitet wurde und machen dann entweder nichts damit oder sie ignorieren das es schon verarbeitet wurde und machen das was sie tun sollen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing DefaultTableModel setValueAt Methode AWT, Swing, JavaFX & SWT 7
D JTable, setValueAt, Laufzeitproblem AWT, Swing, JavaFX & SWT 22
G JTable setValueAt und getValueAt übergeben columnIndex nicht AWT, Swing, JavaFX & SWT 6
Juelin Text und Backgroundcolor im Label geht nicht AWT, Swing, JavaFX & SWT 7
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
B Swing Menü geht nicht AWT, Swing, JavaFX & SWT 5
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
J import javafx.fxml* bei JavaFX 13 geht nicht mehr AWT, Swing, JavaFX & SWT 7
S PatentComponent geht nicht? AWT, Swing, JavaFX & SWT 3
H automatische Anzahl der Spalten ermitteln -> geht nicht AWT, Swing, JavaFX & SWT 6
B JavaFX Wo liegt mein Gedankenfehler ??? KeyEvent geht nicht ... AWT, Swing, JavaFX & SWT 8
J Warum geht das nicht? if-else usw..... compilieren geht nicht -- HILFE!!! AWT, Swing, JavaFX & SWT 10
T JLabel in die Mitte(JLabel.CENTER geht nicht) AWT, Swing, JavaFX & SWT 12
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
B Swing Form undecorated: Beim Bewegen geht die Maus immer automatisch zur linken Seite. AWT, Swing, JavaFX & SWT 7
I JavaFX - MP3 geht nicht AWT, Swing, JavaFX & SWT 4
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
B JInternalFrame Focus setzten geht nicht AWT, Swing, JavaFX & SWT 2
D Swing fullscreen switch geht nicht richtig AWT, Swing, JavaFX & SWT 8
F Icongröße ändern, geht das ? AWT, Swing, JavaFX & SWT 2
Q Swing MouseListener auf JTable geht nicht AWT, Swing, JavaFX & SWT 2
0 JTable Spaltenbreite automatisch an Inhalt anpassne geht nicht AWT, Swing, JavaFX & SWT 3
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
R JTextField mit abgerundeten Ecken - Geht über Grenze hinaus AWT, Swing, JavaFX & SWT 4
B Java und ansprechende Benutzeroberflächen - geht das? AWT, Swing, JavaFX & SWT 16
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
C Java2D Transparenz geht bei einfärben verloren AWT, Swing, JavaFX & SWT 7
T transparent geht nicht (btw: rechteck) AWT, Swing, JavaFX & SWT 13
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Y LookAndFeel Nimbus einschalten geht nicht AWT, Swing, JavaFX & SWT 31
M Bild aus .jar Archiv laden geht nicht AWT, Swing, JavaFX & SWT 6
L Stopp Button geht nicht AWT, Swing, JavaFX & SWT 2
S JDesktopPane bei Button-Klick anzeigen geht nicht AWT, Swing, JavaFX & SWT 5
D JList Scrollbar machen geht nicht AWT, Swing, JavaFX & SWT 4
J Label mit transparentem hintergrund - geht das? AWT, Swing, JavaFX & SWT 21
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
B Panels stapeln, geht das? AWT, Swing, JavaFX & SWT 7
P SetBounds auf JPanel geht nicht! AWT, Swing, JavaFX & SWT 2
S SWT Composite mit Layout Manager geht nicht AWT, Swing, JavaFX & SWT 4
S JPanel geht über Rand hinaus AWT, Swing, JavaFX & SWT 7
E setAlwaysOnTop geht verloren AWT, Swing, JavaFX & SWT 3
B Swing Variable in JTextfield geht nicht AWT, Swing, JavaFX & SWT 10
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
M FileFilter geht nicht AWT, Swing, JavaFX & SWT 5
A repaint() geht nicht ? AWT, Swing, JavaFX & SWT 5
D Jlist auf 10 Zeilen begrenzen geht bei mir nicht AWT, Swing, JavaFX & SWT 2
D Runtime.getRuntime.exec() + SWT oder Swing = geht nicht AWT, Swing, JavaFX & SWT 2
M Action.DISPLAYED_MNEMONIC_INDEX_KEY geht nicht mehr AWT, Swing, JavaFX & SWT 2
F JScrollPane setLayout geht nicht AWT, Swing, JavaFX & SWT 2
R MVC: System.out.prinln in View umleiten geht nicht richtig AWT, Swing, JavaFX & SWT 7
B MouseListener / doppelklick geht net AWT, Swing, JavaFX & SWT 16
G JToggleButton pressed geht nicht AWT, Swing, JavaFX & SWT 2
G setLocationRelativeTo(frame) geht plötzlich nicht mehr AWT, Swing, JavaFX & SWT 3
G fireTableDataChanged() geht das auch ohne vector? AWT, Swing, JavaFX & SWT 13
Z Buttons erscheinen erst wenn man mit der Maus drüber geht AWT, Swing, JavaFX & SWT 7
P GridBagLayout einfaches Beispiel geht nicht? AWT, Swing, JavaFX & SWT 5
I Tastur eingabe geht nicht (wenn Button vorhanden) AWT, Swing, JavaFX & SWT 5
W Swing, 2 JProgressbars und threads geht das? AWT, Swing, JavaFX & SWT 2
X JTable "geht" erst beim 2.Klick AWT, Swing, JavaFX & SWT 2
I JRadioButton disablen geht nicht AWT, Swing, JavaFX & SWT 4
M Wieso geht das nicht! AWT, Swing, JavaFX & SWT 3
G JDialog hinter Glasspane von JFrame. Geht das? AWT, Swing, JavaFX & SWT 3
P [SWT] - ProgressBar, Prozentzahlen live anzeigen geht nicht AWT, Swing, JavaFX & SWT 13
W netbeans projekt in Eclipse importieren -gui teil geht nicht AWT, Swing, JavaFX & SWT 5
V JTable - farbige Boolean-Felder - geht das? AWT, Swing, JavaFX & SWT 3
O Panels ein und ausblenden - geht das? AWT, Swing, JavaFX & SWT 3
T Look and Feel ändern geht nicht, obwohl es geht. AWT, Swing, JavaFX & SWT 2
F Serialisiertes Object geht nicht zu Inizialisieren AWT, Swing, JavaFX & SWT 7
K setSize und setLocation geht nicht AWT, Swing, JavaFX & SWT 8
S JFileChooser Pfadübergabe mit Leerzeichen geht nicht AWT, Swing, JavaFX & SWT 6
G Warum geht das nicht? AWT, Swing, JavaFX & SWT 3
S JScrollPane in einem JDialog = geht nicht? AWT, Swing, JavaFX & SWT 14
B Layoutvorgabe: Geht so was überhaupt? AWT, Swing, JavaFX & SWT 5
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
S JLabel zeilenumbruch ? geht das in JDialog? AWT, Swing, JavaFX & SWT 2
T Paint-Methode geht nicht AWT, Swing, JavaFX & SWT 5
R Wie geht dieser Effekt? AWT, Swing, JavaFX & SWT 15
I SWT - Browser.setUrl(url) geht nicht :-( AWT, Swing, JavaFX & SWT 6
M Antialiasing geht . bis zum repaint ! AWT, Swing, JavaFX & SWT 4
J Jar Datei geht nicht richtig AWT, Swing, JavaFX & SWT 7
S JTextArea background Transparent geht nicht AWT, Swing, JavaFX & SWT 23
raptorrs Swing, Datenformate und wie geht der Datentransfer? AWT, Swing, JavaFX & SWT 8
M setOpaque() geht. und geht nicht :-( AWT, Swing, JavaFX & SWT 2
A Zeichnen auf zwei Labels. Geht nit AWT, Swing, JavaFX & SWT 7
R Farbcode geht nicht AWT, Swing, JavaFX & SWT 4
I setUndecorated geht nicht. AWT, Swing, JavaFX & SWT 3
G Zugriff auf TextField geht nicht AWT, Swing, JavaFX & SWT 5
L JComboBox befüllen geht nicht. AWT, Swing, JavaFX & SWT 18
G jbutton mit linebreak. setEnabled geht nicht mehr AWT, Swing, JavaFX & SWT 4
J Gleitende Fenster in Java - geht das? AWT, Swing, JavaFX & SWT 2
G Look&Feel geht nicht AWT, Swing, JavaFX & SWT 3
B Jlist getSelectedIndices geht net AWT, Swing, JavaFX & SWT 2
Z JScrollPane geht nicht AWT, Swing, JavaFX & SWT 7
F Internes Frame RICHTIG schließen..geht das überhaupt ? AWT, Swing, JavaFX & SWT 2
N Methode für Bild laden geht nur in der eigenen Klasse... AWT, Swing, JavaFX & SWT 3
A Speichern-Dialog geht nicht weg AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen


Oben