keylistener auf jtable

Status
Nicht offen für weitere Antworten.
J

java_starter_dl

Gast
Hi leuz!
Brauch wieder mal ein bisschen hilfe...

Ich habe eine jTable, in der Personaldaten angezeigt werden. Wenn eine Zeile selektiert wird, müssen gewisse Daten dieser Zeile ausgelesen werden. Ich habe das mit einem MouseListener gelöst.

Nun habe ich das Problem, wenn der User mit den Pfeil-Tasten die Tabelle durchsucht passiert natürlich gar nix!
Welchen Listener kann man da für die up and down Tasten nehmen, und welche Methode davon muss ich überschreiben?

hier ist mein Code für den Mouse listener:

Code:
        this.jTbPersonaldaten.addMouseListener(new java.awt.event.MouseAdapter() 
        { 
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) 
            { 
                Personaldaten_Selection(); 
            } 
        }
        );


Bin dankbar für jede Hilfe!
lg
 

Niki

Top Contributor
Du verwendest generell den falschen Listener. Das macht man nicht über Mouse- Keylistener, sondern über einen ListSelectionListener

Das schaut dann so aus:
Code:
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
  public void valueChanged(ListSelectionEvent e){

  }
});
 
J

java_starter_dl

Gast
ah ok, thx!
Da is dann des mit den key-up un down auch abgedeckt!
Werd ich gleich mal ausporbieren! Danke niki!
 
J

java_starter_dl

Gast
Hi! Hab die Listener jetzt so verändert wie du mir das geschildert hast. Jetzt habe ich das Problem, dass jedes mal wenn der User den Value in der Tabelle verändert, der listener 2 mal ausgeführt wird! Kann mir das jemand erklären?
Das soll er nämlich nicht, denn sonst stimmt meine Logik die ich in der Funktion habe die ich im Listener aufrufe nicht mehr...

Danke schon mal!
lg
 

Niki

Top Contributor
Probier mal das:
Code:
table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
  public void valueChanged(ListSelectionEvent e){
    if(e.getValueIsAdjusting()){
      //hier deine Logik ausführen
    }
  }
});
 
J

java_starter_dl

Gast
ok, du bist ziemlich gut! :)

Leider wird die if-Bedingung nicht erfüllt wenn eine Zeile selektiert wird, die bereits makiert ist.

Ich sag dir schnell wozu ich das brauche:
Ich habe da eine Spalte in der Tabelle die den Status des Datensatzes angibt. Entweder aktiv oder inaktiv. Hab das simpel gelöst indem ich jedesmal wenn der User auf die Spalte klickt ein 'X' reinschreibe, oder wenn bereits ein 'X' drinn steht, wird es eben gelöscht.
 

Niki

Top Contributor
Das solltest du dann anders lösen:

Im TableModel überschreibst du die Methoden getColumnClass(int), isCellEditable(int, int) und setValueAt(Object, int, int)

Bei getColumnClass gibst du für die aktiv-Spalte Boolean.class zurück. (für den Rest halt die dazugehörige Klasse)

isCellEditable gibt true für die aktiv-Spalte zurück

setValueAt setzt vom Objekt den übergebenen Wert. Ich poste dir mal ein Beispiel welches du laufen lassen kannst:

Code:
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;

public class MyFrame extends JFrame {

	private TableModel<TableObject> model = null;
	private JTable table = null;

	public MyFrame() {
		super("Table Demo");
		guiInit();
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

		fillTable();
	}

	private void guiInit() {
		Container cont = getContentPane();
		cont.setLayout(new BorderLayout());	

		model = new TableModel<TableObject>(new String[] { "Values", "Active" }) {
			public Object getValueAt(int rowIndex, int columnIndex) {
				switch (columnIndex) {
				case 0:
					return getElementAt(rowIndex).getValue();
				case 1:
					return getElementAt(rowIndex).isActive();
				}
				return null;
			}

			@Override
			public Class getColumnClass(int columnIndex) {
				switch (columnIndex) {
				case 0:
					return String.class;
				default:
					return Boolean.class;
				}
			}
			
			@Override
			public boolean isCellEditable(int rowIndex, int columnIndex) {
				return columnIndex == 1;
			}
			
			@Override
			public void setValueAt(Object value, int rowIndex, int columnIndex) {
				TableObject to = getElementAt(rowIndex);
				to.setActive((Boolean)value);
				fireTableRowsUpdated(rowIndex, rowIndex);
			}
		};

		table = new JTable(model);

		JScrollPane scroller = new JScrollPane();
		scroller.getViewport().add(table);
		
		cont.add(scroller, BorderLayout.CENTER);	
	}

	private void fillTable() {
		List<TableObject> content = new ArrayList<TableObject>();
		for (int i = 0; i < 50; i++) {
			content.add(new TableObject("Value" + i));
		}
		model.setContent(content);

	}

	private class TableObject {
		private String value = null;
		private boolean selected = false;
		private boolean active = true;

		public boolean isActive() {
			return active;
		}

		public void setActive(boolean active) {
			this.active = active;
		}

		public TableObject() {

		}

		public TableObject(String value) {
			setValue(value);
		}

		public String getValue() {
			return value;
		}

		public void setValue(String value) {
			this.value = value;
		}

		public boolean isSelected() {
			return selected;
		}

		public void setSelected(boolean selected) {
			this.selected = selected;
		}

	}

	public static void main(String[] args) {
		new MyFrame().setVisible(true);
	}

}

Und hier noch das TableModel
Code:
import java.util.ArrayList;
import java.util.List;


import javax.swing.table.AbstractTableModel;

public abstract class TableModel<T> extends AbstractTableModel {

	private List<T> content = null;
	private String[] header = null;

	public TableModel(List<T> content, String[] header) {
		this.content = content;
		this.header = header;
	}

	public TableModel(String[] header) {
		this(new ArrayList<T>(), header);
	}

	public List<T> getContent() {
		return content;
	}

	public void setContent(List<T> content) {
		this.content = content;
		this.fireTableDataChanged();
	}

	public void addElement(T o) {
		int pos = content.size();
		content.add(o);
		this.fireTableRowsInserted(pos, pos);
	}

	public void editElement(T oldo, T newo) {
		int pos = content.indexOf(oldo);
		if (pos == -1) {
			return;
		}

		content.remove(oldo);
		content.add(pos, newo);
		this.fireTableRowsUpdated(pos, pos);
	}

	public void editElement(int pos, T newo) {
		content.remove(pos);
		content.add(pos, newo);
		this.fireTableRowsUpdated(pos, pos);
	}

	public void deleteElement(T o) {
		int pos = content.indexOf(o);
		if (pos == -1) {
			return;
		}

		content.remove(o);
		this.fireTableRowsDeleted(pos, pos);
	}

	public void deleteElement(int pos) {
		content.remove(pos);
		this.fireTableRowsDeleted(pos, pos);
	}

	public int getColumnCount() {
		return header.length;
	}

	public String getColumnName(int col) {
		return header[col];
	}

	public int getRowCount() {
		return content.size();
	}

	public T getElementAt(int index) {
		return content.get(index);
	}	

}

Dieser Link könnte dir auch noch helfen: How_to_use_Tables
 
J

java_starter_dl

Gast
du überforderst mich da jetzt ein bisschen :oops: , aber ich versuchs mal, ist auf jedenfall eine optisch schönere Lösung!
Danke erstmal...
 

Niki

Top Contributor
Du packst das schon. Ist nicht so schwer und wenn du Fragen hast brauchst du sie nur zu stellen. Wichtig ist halt dass du auf jeden Fall dein eigenes TableModel verwendest, sonst kommst du irgendwann in Teufels Küche
 
J

java_starter_dl

Gast
hab das jetzt mal versucht so umzusetzen, und dabei mein Programm ziemlich über den Haufen geworfen. Ein Problem hab ich noch, vielleicht kennst du es ja: mir wird anstatt der Checkboxen der Text true und false angezeigt. Wenn ich darauf klicke, wird ganz kurz die Checkbox angezeigt.
Idee?
 
J

java_starter_dl

Gast
Ach, hab den fehler schon gefunden. Hatte auf die Spalte noch irgendwo einen CellRenderer gesetzt. jetzt funktioniert das. Mal sehen wies weiter geht....
 
J

java_starter_d alias Phil

Gast
neue Frage... sorry dass ich dich so in anspruch nehme...

in welche Methode springt er hin, wenn sich die Checkbox verändert?, denn dann muss ich etwas in der Datenbank tun.
Im Moment ist es so, dass der Listener schreit, wenn ich auf die Chechbox klicke, und in der Methode die der Listener aufruft guck ich mal nach ob die Checkboxen jetzt true oder false sind. Je nachdem führe ich dann irgendetwas in der Datenbank aus.
Aber da kommt wieder das Problem von vorhin: Wenn ich jetzt mehrmals auf die Checkbox klicke, verändert sich die Checkbox zwar, aber der Listener wird nur einmal ausgeführt da es immer die gleiche Zeile ist...

Anderer Listener?
 

Niki

Top Contributor
Das mit der Datenbank halte ich für keine gute Idee. Du solltest erst beim Klicken auf Speichern in die Datenbank schreiben. Sonst ist das ja ein ganz schöner Performancekiller. Wenn du die CheckBox anklickst wird die Methode setValueAt im TableModel aufgerufen. Dort wird dann der neue Wert vom Objekt gesetzt.
 
J

java_starter_Phil

Gast
das layout ist leider so vorgegeben, und die performance ist dabei kein problem (Schnelle Verbindung, Sehr Guter Oracle Server).
Das mit dem setValue werde ich dann verwenden, aber fällt dir nicht noch ein anderer Listener ein?

Mir ist da noch ein anderer Lösungsansatz eingefallen:
Wie wärs, wenn ich zusätzlich einen Mouse-Listener mache, und falls sich der wert der Table nicht verändert hat soll er eben das tun was sonst das valueChanged gemacht hat... Dazu muss ich allerdings prüfen ob sich der Wert verändert hat ... geht das irgendwie?

danke vielmals nochmal!
 

Niki

Top Contributor
Naja, ich find MouseListener bei einer JTable nicht sehr schön (außer bei double-Klick). Was genau hast du denn vor? Willst du jedes mal beim Ändern des Models in der Datenbank etwas ändern? Wenn ja könnte dir dieser Listener auch noch helfen: TableModelListener
 
J

java_starter_Phil

Gast
Ok, ich versuche dir jetzt zu erklären was ich machen möchte... hoff ich schaff das irgendwie verständlich:

Ich habe eine Tabelle mit Berechtigungen. Diese Tabelle hat folgende Spalten:
USBNR: das ist die Nummer der Berechtigung
Beschreibung: ...der Berechtigung
Status: ... ist die Berechtigung aktiv oder inaktiv
Einschränkung: Auf jede Berechtigung können beliebig viele Einschränkungen definiert werden die hier angezeigt werden.


Der Workflow sieht folgendermaßen aus:
User wählt eine Berechtiung.
User setzt Berechtigung aktiv. (Berechtigung wird in der Datenbank aktiv gesetzt)
User klickt auf die Spalte Einschränkung der einzuschränkenden Berechtigung (nur möglich wenn Berechtigung aktiv ist).
Ein Dialog öffnet sich.
User wählt Einschränkungen aus.
User schließt Dialog. (ausgewählte Einschränkungen werden der Berechtigung in der Datenbank zugeordnet)
Tabelle wird aktualisiert.


hoff man kann das irgendwie verstehen... ???:L

lg
 

Niki

Top Contributor
Da hast du meiner Meinung nach zwei Möglichkeiten das schön zu lösen:

Entweder du baust dir zum Bearbeiten einer Berechtigung einen Dialog, wo alle relevanten Daten angezeigt werden. Beim Bestätigen des Dialogs werden die Änderungen in die Datenbank geschrieben und die Änderungen ins TableModel übernommen. Der Dialog wird über einen Doppelklick auf die Tabelle angezeigt und mit der selektierten Zeile befüllt.

Die andere Möglichkeit ist dass du alle Berechtigungen bearbeiten kannst und einen Speichern-Button anbietest. Beim Speichern wird überprüft was sich geändert hat und nur die Änderungen in die Datenbank übernommen. Dies ist meiner Meinung nach aber die viel schwierigere Option, da du alle Änderungen irgendwie mitbekommen musst.

Falls du es aber auf deine Art machen möchtest sollte der TableModelListener hilfreich sein.
 
J

java_starter_Phil

Gast
da hast du wahrscheinlich recht. TableModelListener will eh net so richtig, also mach ich es mit doppelklick auf die Zeile. Wie mach ich denn das mit dem Doppelklick? Wieder mit MouseListener? Gibts da einen eigenen für Doppelklick?

lg
 
J

java_starter_Phil

Gast
ja, hab ich auch so gelöst!
Jetzt müsst ich eigentlich allein klar kommen... Vielen Dank niki, du hast mir sehr weitergeholfen! :toll:
bis bald.... (hoffentlich nicht allzu bald :wink: )
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
VfL_Freak KeyEvent.VK_TAB im KeyListener abfragen Allgemeine Java-Themen 13
N Keylistener ohne Dazugehörige Gui Allgemeine Java-Themen 6
R Java KeyListener buggt? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T KeyListener Allgemeine Java-Themen 1
S KeyListener ohne Focus - Wie? Allgemeine Java-Themen 2
E KeyListener ohne GUI Allgemeine Java-Themen 6
C KeyListener auslagern - Wie? Allgemeine Java-Themen 3
P Tastatur abfrage ohne KeyListener Allgemeine Java-Themen 3
B Keylistener geht nicht Allgemeine Java-Themen 9
A keylistener funktionirt nicht Allgemeine Java-Themen 4
M KeyListener Allgemeine Java-Themen 8
S C++/C KeyListener zusammen mit Java Programm Allgemeine Java-Themen 4
T KeyListener lässt sich nur einmal drücken Allgemeine Java-Themen 2
B MouseListener und KeyListener Allgemeine Java-Themen 15
C Sudoku und KeyListener Allgemeine Java-Themen 2
O Frage zum KEyListener Allgemeine Java-Themen 3
ARadauer mit keylistener hören auch wenn frame nicht den focus hat Allgemeine Java-Themen 2
U Frage zum KeyListener Allgemeine Java-Themen 7
B KeyListener auf mehrere TextFields anwenden Allgemeine Java-Themen 5
G KeyListener: Wiederholtes Aufrufen von KeyPressed verhindern Allgemeine Java-Themen 3
M Tab und KeyListener in einer JTextArea Allgemeine Java-Themen 7
D Allgemeiner KeyListener Allgemeine Java-Themen 4
G KeyListener auf ALT + S Allgemeine Java-Themen 5
S KeyListener! Image Problem! Allgemeine Java-Themen 2
7 Keylistener Allgemeine Java-Themen 3
TheJavaKid Focus für KeyListener setzen Allgemeine Java-Themen 5
M Keylistener für sondertasten an Tastaturen? Allgemeine Java-Themen 6
S Keylistener funktioniert nicht(setFocusable) Allgemeine Java-Themen 4
K KeyListener-Alternative ohne anfängliches Delay ? Allgemeine Java-Themen 5
R Global KeyListener/MouseListener Allgemeine Java-Themen 4
T Unterschiede beim KeyListener zwischen NT und XP Allgemeine Java-Themen 6
R KeyListener ohne Frame und Applet Allgemeine Java-Themen 7
F KeyListener für JTextField Allgemeine Java-Themen 4
S KeyListener ohne awt Allgemeine Java-Themen 2
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
H Swing JTextArea als TableCellRenderer in JTable - wie Zeilen selektieren? Allgemeine Java-Themen 47
D JTable mit JTextAreas in den Zellen Allgemeine Java-Themen 8
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
G jTable aktualisieren?! Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
V JTable Externe Lib Allgemeine Java-Themen 2
F JTable Pfeiltasten-Verhalten Allgemeine Java-Themen 1
T jTable Gestaffelte Überschriften Allgemeine Java-Themen 22
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
A JTable Bilder Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
A JTable - CellRange auslesen Allgemeine Java-Themen 2
A jTable Renderer Allgemeine Java-Themen 5
N JTable filtern Allgemeine Java-Themen 3
hdi JTable#print & Druckgröße Allgemeine Java-Themen 6
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
G JTable: ListSelectionListener removen Allgemeine Java-Themen 8
M JTable + ArrayList Allgemeine Java-Themen 3
G Aktualisierung einer JTable erfolgt nicht zuverlässig Allgemeine Java-Themen 14
E Hintergrund einer JTable änden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
P jTable getSelectedRow? Allgemeine Java-Themen 2
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
X xml aus Zip in JTable Allgemeine Java-Themen 2
L jTable drag & drop einzelner Zeilen Allgemeine Java-Themen 4
S JTable und Spalten löschen Frage Allgemeine Java-Themen 5
H JTable per iText in PDF: Größenanpassung möglich? Allgemeine Java-Themen 2
F XML zu JTable mit JDOM Allgemeine Java-Themen 2
E JTable wird nicht angezeigt Allgemeine Java-Themen 11
Screen ImageIcon in Cell der JTable Allgemeine Java-Themen 2
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
A Swing JTable Polymorphismus Allgemeine Java-Themen 2
trash super + JTable Allgemeine Java-Themen 7
D JTable -> 1Spalte nur zahlen Allgemeine Java-Themen 2
L JTABLE setvalueat methode! Allgemeine Java-Themen 16
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
B JTable nach Icon sortieren Allgemeine Java-Themen 6
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
M jdesktop binding: jTable update nach Änderung... Allgemeine Java-Themen 3
D JTable mit GROUP BY Allgemeine Java-Themen 23
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
P JTable drucken Allgemeine Java-Themen 8
A JTable Feldwerte in JTextFelder mit blättern Allgemeine Java-Themen 5
DStrohma [Erledigt] Wieso kann ich Taste 'ENTER' in JTable nicht belegen? Allgemeine Java-Themen 2
M jTable Allgemeine Java-Themen 19
D jTable und TableModel Allgemeine Java-Themen 2
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
A Observable BeansBinding an einer JTable bzw. JXTable Allgemeine Java-Themen 3
P Textfile -> Array -> JTable Allgemeine Java-Themen 9
S JTable Aktuelisieren ber Wie ? Allgemeine Java-Themen 4
MQue JComboBox in JTable Allgemeine Java-Themen 4
J Ergebnismenge eines SQL-Queries in JTable anzeigen Allgemeine Java-Themen 3
MQue JTable alles rechts Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben