JTable editierbar, Enter Event,...

Status
Nicht offen für weitere Antworten.

Robinson

Mitglied
Hi,

ich code schon ein paar Stunden an einer Komponente rum und komme nicht zu dem Ergebnis dass ich gerne hätte.

Meine Vorstellung:


Eine JTable zum Erfassen von Artikelpreisen:

Spalte 1: Artikelnummer
Spalte 2: Beschreibung
Spalte 3: Preis

Gewünschtes Verhalten:

- ich möchte die Zellen direkt editieren können ohne erst einen Doppelklick machen zu müssen.
- nach der Eingabe der Artikelnummer sollte in einer Datenbank nach dem Artikel gesucht werden und wenn vorhanden eingetragen (Fokus auf Preisfeld)
- Beim Drücken von Return sollte der Fokus in die nächste Spalte und am Ende der Zeile in die nächste Zeile springen
- Beim Auswählen einer Zelle sollte der Inhalt bereits selektiert werden damit er direkt überschrieben werden kann.


Was ich habe:

Den Artikel suchen

- habe ich im Model über die Methode setValueAt realisiert.
ich frage die Spalte ab und reagiere entsprechend (Funktionsaufruf, "Daten laden")


die Zeilen direkt editieren

- habe ich realisiert durch den Aufruf von
Code:
((DefaultCellEditor)table.getDefaultEditor(Object.class)).setClickCountToStart(1);

bei Enter in nächste Spalte

- habe ich über einen KeyListener bei der Table versucht, ohne Erfolg.
- Das Event der Componente wird scheinbar ausgeführt, aber der Focus ändert sich nicht.

bei Focus Inhalt selektieren

- ich habe der TextField Komponente einen FocusListener gegeben aber das hat nichts bewirkt
 

Robinson

Mitglied
Das mit dem bei Enter in nächstes Feld habe ich auch inzwischen gefunden,
zumindest fast.

Dieser Thread behandelt ein entsprechendes Beispiel:
www.java-forum.org/de/viewtopic.php?t=28907


Das funktioniert auch soweit, aber leider muss ich beim Verlassen der Zelle zwei Mal Enter drücken.
Mit dem ersten mal beendet sich der Edit Mode mit dem zweiten mal springt er mit dem Focus ins nächste Feld.


Wie kann ich meinem CellEditor klar machen dass er beim Enter Press in die nächste Spalte springen soll?
 

Robinson

Mitglied
I got it!

:D

Also, für die Welt da drausen ;)


Lösung für: die Zelle direkt editieren, Tabs innerhalb der Tabelle, bei onFocus Inhalt selektieren


Eigener CellEditor:

Code:
import java.awt.Component;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

class MyTextEditor extends JTextField implements TableCellEditor {

	private static final long serialVersionUID = 1L;

	private List listeners = new ArrayList();

	// Standardkonstruktor
	public MyTextEditor() {
		addFocusListener(MyFocusListener.get());
		setBorder(BorderFactory.createEmptyBorder());
	}

	// Möglicherweise möchte jemand über Ereignisse des Editors
	// informiert werden
	@SuppressWarnings("unchecked")
	public void addCellEditorListener(CellEditorListener l) {
		listeners.add(l);
	}

	// Ein CellEditorListener entfernen
	public void removeCellEditorListener(CellEditorListener l) {
		listeners.remove(l);
	}

	// Gibt den aktuellen Wert des Editors zurück.
	public Object getCellEditorValue() {
		return getText();
	}

	// Gibt eine Component zurück, welche auf dem JTable dargestellt wird,
	// und mit der der Benutzer interagieren kann.
	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
		Vector v = (Vector)((DefaultTableModel)table.getModel()).getDataVector().get(row); 
		setText((String)v.get(column));
		return this;
	}

	// Gibt an, ob die Zelle editierbar ist. Das EventObject kann
	// ein MouseEvent, ein KeyEvent oder sonst was sein.
	public boolean isCellEditable(EventObject anEvent) {
		return true;
	}

	// Gibt an, ob die Editor-Component selektiert werden muss, um
	// sie zu benutzen. Diese Editor soll immer selektiert werden,
	// deshalb wird hier true zurückgegeben
	public boolean shouldSelectCell(EventObject anEvent) {
		return true;
	}

	// Bricht das editieren der Zelle ab
	public void cancelCellEditing() {
		fireEditingCanceled();
	}

	// Stoppt das editieren der Zelle, sofern möglich.
	// Da der JSpinner immer einen gültigen Wert anzeigt, kann auch
	// jederzeit gestoppt werden (return-Wert = true)
	public boolean stopCellEditing() {
		fireEditingStopped();
		return true;
	}

	// Benachrichtig alle Listener, dass das Editieren abgebrochen wurde
	protected void fireEditingCanceled() {
		ChangeEvent e = new ChangeEvent(this);
		for (int i = 0, n = listeners.size(); i < n; i++)
			((CellEditorListener) listeners.get(i)).editingCanceled(e);
	}

	// Benachrichtig alle Listener, dass das Editieren beendet wurde
	protected void fireEditingStopped() {
		ChangeEvent e = new ChangeEvent(this);
		for (int i = 0, n = listeners.size(); i < n; i++)
			((CellEditorListener) listeners.get(i)).editingStopped(e);
	}
}

FocusListener:

Code:
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.text.JTextComponent;

public class MyFocusListener implements FocusListener {

	public void focusGained(FocusEvent focusevent) {
		JTextComponent jtextcomponent = (JTextComponent) focusevent.getComponent();
		jtextcomponent.setSelectionStart(0);
		jtextcomponent.setSelectionEnd(jtextcomponent.getText().length());
	}

	public void focusLost(FocusEvent focusevent) {
	}

	private MyFocusListener() {
	}

	public static MyFocusListener get() {
		if (fl == null)
			fl = new MyFocusListener();
		return fl;
	}

	public static MyFocusListener fl = null;

}


Die abgeleitete Tabellenkomponente:

Code:
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.InputMap;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.TableModel;

public class EditorTable extends JTable {

	private static final long serialVersionUID = 1L;
	
	public EditorTable() {
		super();
		init();
	}
	
	public EditorTable(TableModel model) {
		super(model);
		init();
	}
	
	private void init() {
		
		this.setDefaultEditor(Object.class, new MyTextEditor());
		
		// "Enter"-Taste bekommt die Funktion der "Tab"-Taste
        InputMap im = getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
        KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
        Object tabFunktion = im.get(tab);
        im.put(enter, tabFunktion);
        
        //  Das übliche "Tab" Verhalten überschreiben:
        //  Auf die nächste editierbare Zelle springen;
        //  wenn keine editierbare Zellen vorhanden, auf nächste Zelle gehen.
        final Action alteTabAktion = getActionMap().get(tabFunktion);
        Action tabAktion = new AbstractAction() {

        	private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {
				JTable tabelle = (JTable)e.getSource();
				alteTabAktion.actionPerformed( e );
				
				tabelle.editCellAt(tabelle.getSelectedRow(),tabelle.getSelectedColumn());
            }
        };
        getActionMap().put(tabFunktion, tabAktion);
        addKeyListener(new KeyAdapter(){
            public void keyReleased(KeyEvent e){
                enterKeyReleased(e);
            }
        });

	}
	
    private void enterKeyReleased(KeyEvent e){
        if(getCellEditor()!=null){
            getEditorComponent().requestFocusInWindow();
        }
    }

}



Die obigen Klassen basieren auf verschiedenen Codes aus diesem Forum.
Ich möchte ja nicht die Leistung Anderer als meine eigene darstellen.


Lösung für: den Artikel suchen

Code:
	private DefaultTableModel tableModel = new DefaultTableModel() {
		public boolean isCellEditable(int i, int j) {
			return true;
		}
		
		@SuppressWarnings("unchecked")
		public void setValueAt(Object value, int row, int col) {
			
			if (col==0) {
				if (table.isEditing()) selectArticleByProducerId(value, row);
			}
			if (col==1) {
				selectArticleBySupplierId(value, row); 
			}
			((Vector)getDataVector().get(row)).set(col, value);
			
			if (!lastRowEmpty()) addEmptyRow();
		}
		private static final long serialVersionUID = 1L;
	};

Das basiert jetzt tatsächlich auf meinem Mist :)


Ich habe keine Ahnung ob dieser Code für irgendwen von Nutzen ist?
Mir hat das einen ganz schön nervigen tag gebracht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JTable Zellinhalt markierbar aber nicht editierbar AWT, Swing, JavaFX & SWT 4
G Swing JTable nicht editierbar AWT, Swing, JavaFX & SWT 2
X JTable Zellen nicht editierbar AWT, Swing, JavaFX & SWT 5
G JTable in Spalte von anderer JTable nicht editierbar AWT, Swing, JavaFX & SWT 7
J in JTable ganze Spalte editierbar machen AWT, Swing, JavaFX & SWT 17
X in JTable nur einige Zellen editierbar machen AWT, Swing, JavaFX & SWT 2
S JTable soll nicht mehr editierbar sein! AWT, Swing, JavaFX & SWT 2
O JTable - Nicht editierbar aber anwählbar? AWT, Swing, JavaFX & SWT 7
M Wie einen JTable editierbar machen (mit eigenem TreeModel) AWT, Swing, JavaFX & SWT 2
E JTable einzelne reihe editierbar machen AWT, Swing, JavaFX & SWT 2
W Problem/Absturz bei Zelle nicht editierbar setzen (JTable) AWT, Swing, JavaFX & SWT 6
C JTable: Einzelne Spalten nicht editierbar machen AWT, Swing, JavaFX & SWT 2
W JTable: Zeilen nicht editierbar setzen AWT, Swing, JavaFX & SWT 6
H JTable editierbar AWT, Swing, JavaFX & SWT 2
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben