KeyEvent bei JTable mehrmals hintereinander ausführen

Status
Nicht offen für weitere Antworten.

julchen81

Bekanntes Mitglied
Hallo,

ich habe ein JFrame mit einem JTable erstellt.
Mit Strg+D und Strg+L kann ich eine Zeile löschen bzw. neu einfügen.

Wenn ich jetzt mehrmals hintereinander diese Tastenkombinationen drücke, reagiert meine JTable nur beim ersten Mal.
Um erneut die Tastenkombi ausführen zu können, muss ich extra noch mal in die Tabelle klicken, obwohl eigentlich auch nach dem ersten Drücken von Strg+D/L die aktuelle Zeile markiert ist.

Hier beispielsweise ein Teilstück des Codes der Klasse AddLine, die KeyListener implementiert:
Code:
public void keyPressed(KeyEvent e) {
		int row = gui.table.getSelectedRow();

		if ((e.isControlDown()) && (e.getKeyCode() == KeyEvent.VK_L)) {
				for (int i = 99; i > row; i--) {
					for (int j = 0; j < 4; j++) {
						gui.al.dataMiddle[i][j] = gui.al.dataMiddle[i-1][j];
					}
				}
				
				gui.al.dataMiddle[row][0] = null;
				gui.al.dataMiddle[row][1] = null;
				gui.al.dataMiddle[row][2] = null;
				gui.al.dataMiddle[row][3] = null;
				
				
				gui.table = new JTable(gui.al.dataMiddle, gui.columnNames);
				gui.table.setColumnModel(gui.colModel);
				gui.table.addKeyListener(new AddLine(gui));
				gui.table.addKeyListener(new DeleteLine(gui));
				gui.table.getSelectionModel().setSelectionInterval(row, row);
				gui.sp.getViewport().add(gui.table);
			}
...............

Was ist da faul??
Die Tabelle, die ich noch mal erzeuge, besitzt doch nach wie vor die KeyListener... und es funktioniert ja auch ein erneutes Ausführen des Befehles, nur eben erst dann, wenn ich erneute in die Tabelle klicke :x

Ich hatte mehr oder weniger diese Frage schon in's Forum gestellt, aber damals hatte ich gedacht, mein Fehler liegt bei der falschen Markierung... aber das glaube ich mittlerweile nicht mehr. Deshalb hab ich's jetzt neu formuliert.

Wäre echt um Hilfe dankbar!!

Liebe Grüße,
Julia
 
hab ned alles genau gelesen. aber versuch ma sowas wie table.setfocus(); oder irgendwas in die Focus-Richtung eben...
 
es gibt eine Methode setFocusable(boolean bool);

aber ob ich jetzt true oder false übergebe, das Ergebnis ist das Gleiche: ich kann nach wie vor nur einmal eine Tastenkombination benutzen :cry:
 
nee irgendwas mit requestFocus und das nachdem du den keyevent ausgeführt hast, damit die Table wieder den Fokus besitzt... Weiß aba ned ob es geht!
 
Ja also so sollte es gehen:

Code:
public void keyPressed(KeyEvent e) {
      int row = gui.table.getSelectedRow(); 

      if ((e.isControlDown()) && (e.getKeyCode() == KeyEvent.VK_L)) { 
            for (int i = 99; i > row; i--) { 
               for (int j = 0; j < 4; j++) { 
                  gui.al.dataMiddle[i][j] = gui.al.dataMiddle[i-1][j]; 
               }
            }
             
            gui.al.dataMiddle[row][0] = null; 
            gui.al.dataMiddle[row][1] = null; 
            gui.al.dataMiddle[row][2] = null; 
            gui.al.dataMiddle[row][3] = null; 
             
             
            gui.table = new JTable(gui.al.dataMiddle, gui.columnNames); 
            gui.table.setColumnModel(gui.colModel); 
            gui.table.addKeyListener(new AddLine(gui)); 
            gui.table.addKeyListener(new DeleteLine(gui)); 
            gui.table.getSelectionModel().setSelectionInterval(row, row); 
            gui.sp.getViewport().add(gui.table); 
         }
...............
gui.table.requestFocus();
}

So wird dann nachdem alles von KeyPressed ausgeführt wurde der Focus auf die Tabelle gesetzt und somit is diese bereit für einen weiteren STRG+L zugriff oder was auch immer ^^
 
Du erzeugst also jedesmal eine neue Tabelle, wenn du eine neue Linie in der Tabelle benötigst? Das ist kein sehr guter Weg... informiere dich mal was das TableModel ist (z.B. in unserer FAQ), und wie man es benutzen kann (z.B. um neue Zeilen effizient in eine Tabelle zu bringen). :wink:
 
Ach lol des hab ich ja mal gar nicht beachtet... 😳 ich sollte echt besser hinschaun...
 
Eine heiße Spur!!

Jetzt funktioniert fast alles, und zwar folgendermaßen:
Code:
public void keyPressed(KeyEvent e) {
		int row = gui.table.getSelectedRow();
			if ((e.isControlDown()) && (e.getKeyCode() == KeyEvent.VK_L)) {

				for (int i = 99; i > row; i--) {
					for (int j = 0; j < 4; j++) {
						gui.al.dataMiddle[i][j] = gui.al.dataMiddle[i-1][j];
					}
				}
				//Die neue Zeile der Tabelle ist leer
				gui.al.dataMiddle[row][0] = null;
				gui.al.dataMiddle[row][1] = null;
				gui.al.dataMiddle[row][2] = null;
				gui.al.dataMiddle[row][3] = null;
				
				DefaultTableModel model = new DefaultTableModel(gui.al.dataMiddle, gui.columnNames);
				//model.insertRow(row, emptyRow);
				gui.table.setModel(model);
				gui.table.setColumnModel(gui.colModel);
				gui.table.changeSelection(row, 0, false, false);
			}
.....

Was jetzt nach wie vor nicht funktioniert: Meine Spaltenbreiten, die ich im colModel festgelegt hab, werden nach Strg+L ignoriert!! Aber ich setze doch wieder dieses colModel: gui.table.setColumnModel(gui.colModel);

Jemand eine Idee, wie man das noch eliminieren könnte ?? ???:L


Ich hatte es auch mit model.insertRow(row, new Object[] {null, null, null, null}) probiert (und dafür meine for-Schleife weggelassen sowie mir erspart, die einzelnen Einträge auf null zu setzten (gui.al.dataMiddle[row][0] = null;...) ) aber das haut nicht hin!
Wenn ich die for-Schleife weglasse, kann ich die Tastenkombi wieder nur 1x ausführen.
Mach ich's dann zumindest mit der for-Schleife (aber nach wie vor ohne gui.al.dataMiddle[row][0] = null;...) wird nicht unbedingt eine neue Zeile eingefügt, sondern lediglich der Inhalt nach unten verschoben und zwar so weit, bis eine leere Zeile auftaucht. Ist diese Zeile dann inmitten der Tabelle, werden die darunterliegenden Einträge nicht nach unten vershoben, sondern diese leere Zeile wird mit den darüberliegenden Einträgen gefüllt. Die leere Zeile ist also dann nicht mehr da.

Julia
 
Jetzt hab ich's - musste einen anderen Konstruktor für die allererste JTable verwenden; einen Konstruktor, dem ich dann TableModel und TableColumnModel übergebe.

Bin ich froh. DAAAAAANNNNKKKKEEE!!!!!

Schönen Tag noch, :wink:
Julia
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben