JTable-Probleme

Hallo zusammen,

ich habe einige Schwierigkeiten mit JTables. Wäre toll, wenn jemand weiterhelfen würde!

1) Ich möchte gerne wissen, wann der Benutzer in einer Tabelle etwas verändert hat. Ich habe dafür einen TableModelListener implementiert, dessen "tableChanged"-Methode auch Ereignisse empfängt, wenn innerhalb einer Zelle "Enter" gedrückt wird oder der Fokus auf eine andere Zelle gesetzt wird.
Ich möchte allerdings gerne bereits bei der ersten Eingabe eines neuen Zeichens davon informiert werden (und nicht erst nach Enter oder Fokus auf neuer Zelle). Geht das irgendwie?

2) Ist es möglich, eine ganze Spalte einer Tabelle für den Benutzer uneditierbar zu machen? Geht das mit dem DefaultTableModel?

3) Wie erreiche ich, dass innerhalb einer Zelle der Text umgebrochen wird und die entsprechende Row dann über zwei Zeilen angezeigt wird?

Bin für jede Antwort dankbar!
Viele Grüße,
Peter
 
Zuletzt bearbeitet:
peter_mueller hat gesagt.:
Hallo zusammen,

ich habe einige Schwierigkeiten mit JTables. Wäre toll, wenn jemand weiterhelfen würde!

1) Ich möchte gerne wissen, wann der Benutzer in einer Tabelle etwas verändert hat. Ich habe dafür einen TableModelListener implementiert, dessen "tableChanged"-Methode auch Ereignisse empfängt, wenn innerhalb einer Zelle "Enter" gedrückt wird oder der Fokus auf eine andere Zelle gesetzt wird.
Ich möchte allerdings gerne bereits bei der ersten Eingabe eines neuen Zeichens davon informiert werden (und nicht erst nach Enter oder Fokus auf neuer Zelle). Geht das irgendwie?
Ja ich weiss aber nicht mehr wie. Aber ich weiss das Thomas schonmal sowas hier Vorgestellt hat, benutze mal die Suchfunktion für das Forum, dann müsstest du auf den Beitrag stossen ;)
2) Ist es möglich, eine ganze Spalte einer Tabelle für den Benutzer uneditierbar zu machen? Geht das mit dem DefaultTableModel?
Ja das geht(ich hoffe Spalten sind die Vetrikalen "dinger" ich vertue mich da dauernd :( ) dazu musst du die
Code:
public boolean isCellEditable(int row, int col){
if(row == deineReihe && col == deineSpalte)return false;
return true;
}
überschreiben...
3) Wie erreiche ich, dass innerhalb einer Zelle der Text umgebrochen wird und die entsprechende Row dann über zwei Zeilen angezeigt wird?

Bin für jede Antwort dankbar!
Viele Grüße,
Peter
Das weiss ich selber leider auch nicht, aber noch ein Hinweis schau mal in die Linkliste das steht ein sehr guter JTablelink von Snape drin, wo fast alles was man mit JTables machen kann erklärt wird..

mfg
elmato
 
Hi,

1) Ich möchte gerne wissen, wann der Benutzer in einer Tabelle etwas verändert hat. Ich habe dafür einen TableModelListener implementiert, dessen "tableChanged"-Methode auch Ereignisse empfängt, wenn innerhalb einer Zelle "Enter" gedrückt wird oder der Fokus auf eine andere Zelle gesetzt wird.
Ich möchte allerdings gerne bereits bei der ersten Eingabe eines neuen Zeichens davon informiert werden (und nicht erst nach Enter oder Fokus auf neuer Zelle). Geht das irgendwie?

Du könntest einen DefaultCellEditor mit einem JTextField setzen. Diesem JTextField fügst Du dann einen KeyListener hinzu. Sollte vom Prinzip funktionieren. Einen Code kann ich Dir im Moment leider nicht liefern.

Gruß

Romsl
 
Hallo nochmal,

Problem 1:

Romsl hat gesagt.:
Hi,
Du könntest einen DefaultCellEditor mit einem JTextField setzen. Diesem JTextField fügst Du dann einen KeyListener hinzu. Sollte vom Prinzip funktionieren. Einen Code kann ich Dir im Moment leider nicht liefern.

Das hat gut geklappt! Vielen Dank RomsI! Hier der Code:

Code:
//aufgerufen in der init()-Methode meines Applets ...

JTextField cell_textField = new JTextField();
cell_textField.addKeyListener(new MyKeyCellListener(this));			
DefaultCellEditor cell_editor = new DefaultCellEditor(cell_textField);
//setzen des Editors für die Spalte, die mich interessiert
Class column_class = attr_table.getColumnClass(1);
table.setDefaultEditor(column_class,cell_editor);

sowie die Klasse dazu ...

Code:
import java.awt.event.*;

public class MyKeyCellListener implements KeyListener {
	
	private MyApplet mother_applet;
	
	public MyKeyCellListener(MyApplet mother_applet){
		
		this.mother_applet = mother_applet;
	}
	
	public void keyReleased(KeyEvent e) {
		
		System.out.println("keyReleased " + e.getSource());		
	}
	
	public void keyPressed(KeyEvent e){
		
		System.out.println("keyPresed " + e.getSource());		
	}

	public void keyTyped(KeyEvent e){
		
		System.out.println("keyTyped " + e.getSource());
	}	
}

Problem 2:

elmato hat gesagt.:
Ja das geht(ich hoffe Spalten sind die Vetrikalen "dinger" ich vertue mich da dauernd :( ) dazu musst du die
Code:
public boolean isCellEditable(int row, int col){
if(row == deineReihe && col == deineSpalte)return false;
return true;
}
überschreiben...

Auch das hat gut geklappt und war ja ganz einfach! Danke!

Problem 3:
Frage nach Zeilenumbruch in Tabellenzelle ...
elmato hat gesagt.:
Das weiss ich selber leider auch nicht, aber noch ein Hinweis schau mal in die Linkliste das steht ein sehr guter JTablelink von Snape drin, wo fast alles was man mit JTables machen kann erklärt wird..
Elemato, weißt du zufällig noch, wo du den Link gefunden hast? Ich stelle mich vielleicht ein bisschen doof an, aber ich finde ihn nicht ... :(

außerdem sind jetzt noch Probleme 4 und aufgetaucht:

Kann mir jemand sagen, wie man erreicht, dass ein einfacher Klick in die Tabellenzelle ausreicht, um sie edieren zu können?
Und wie man verhindert, dass dabei die ganze Zeile gehighlighted wird?

Vielen Dank nochmal und viele Grüße,
Peter
 
peter_mueller hat gesagt.:
Kann mir jemand sagen, wie man erreicht, dass ein einfacher Klick in die Tabellenzelle ausreicht, um sie edieren zu können?
Und wie man verhindert, dass dabei die ganze Zeile gehighlighted wird?

Vielen Dank nochmal und viele Grüße,
Peter

Zu 1: Einfach der Tabelle einen MouseListener zuweisen und auf keyReleased reagieren. Im keyReleased schaust Du, ob die JTable.isEditing(). Wenn ja, dann z.B.
Code:
DefaultCellEditor editor = (DefaultCellEditor) table.getCellEditor();
JTextField textField = (JTextField) editor.getComponent();
textField.selectAll();

Zu 2: Das wirst Du wohl für jede Zelle einzeln mittels getCellRendererComponent abfangen müssen.
 
Hallo Snape und alle,

sorry, dass es etwas länger gedauert hat, bis ich reagiere!

Habe leider noch 2 Rückfragen:

1) Mir ist noch ein Fehler bei einem Problem aufgefallen, von dem ich dachte, es sei schon gelöst...

Wie oben schon erwähnt, weise ich dem Table einen DefaultCellEditor mit eigenem KeyCellListener zu, der mich darüber informieren soll, wenn Zeichen in die Tabelle eingefügt werden.
Das Problem ist nun, dass dies nur dann funktioniert, wenn der User zuvor einen Doppelklick in die Zelle gemacht hat. Bei einfachem Klick kann er auch Zeichen eingeben, aber mein KeyCellListener erhält keine Events ...

Hier nochmal der Code:

Code:
//aufgerufen in der init()-Methode meines Applets ...

JTextField cell_textField = new JTextField();
cell_textField.addKeyListener(new MyKeyCellListener(this));			
DefaultCellEditor cell_editor = new DefaultCellEditor(cell_textField);
//setzen des Editors für die Spalte, die mich interessiert
Class column_class = attr_table.getColumnClass(1);
table.setDefaultEditor(column_class,cell_editor);

und der zugehörige KeyCellListener

Code:
class MyKeyCellListener implements KeyListener {		
		
		public void keyReleased(KeyEvent e){

			//HIER KOMMEN NUR DANN EVENTS AN, WENN ZUVOR DOPPELKLICK!

			setAttributeTableChanged(true);					
		}
		
		public void keyPressed(KeyEvent e){			
		}

		public void keyTyped(KeyEvent e){						
		}		
	}

Wie kann ich erreichen, dass schon bei einfachem Klick Events ausgelöst werden?

@Snape:
Den Vorschlag von dir verstehe ich leider nicht so ganz. Ein MouseListener hat doch kein keyReleased(), auf das ich reagieren könnte, oder wie meinst du das?

2)
nochmal zum "Abschalten" des Highlighting:
Snape hat gesagt.:
Zu 2: Das wirst Du wohl für jede Zelle einzeln mittels getCellRendererComponent abfangen müssen.
Wie meinst du das? Muss ich das TableCellRenderer Interface implementieren? Du hast nicht zufällig ein Code-Schnippsel?

Vielen Dank und schönen Gruß,
Peter
 
peter_mueller hat gesagt.:
Hallo Snape und alle,

sorry, dass es etwas länger gedauert hat, bis ich reagiere!

Habe leider noch 2 Rückfragen:

Wie kann ich erreichen, dass schon bei einfachem Klick Events ausgelöst werden?

@Snape:
Den Vorschlag von dir verstehe ich leider nicht so ganz. Ein MouseListener hat doch kein keyReleased(), auf das ich reagieren könnte, oder wie meinst du das?
Sorry, meinte natürlich mouseReleased
peter_mueller hat gesagt.:
2)
nochmal zum "Abschalten" des Highlighting:

Wie meinst du das? Muss ich das TableCellRenderer Interface implementieren? Du hast nicht zufällig ein Code-Schnippsel?

Vielen Dank und schönen Gruß,
Peter
Nicht direkt, aber bitte hier im Forum :google:
Beispiele zum (Default)TableCellRenderer gibt es hier sicher genug.
 
Hallo,

Snape hat gesagt.:
Sorry, meinte natürlich mouseReleased

@Snape:
Habe dann aber immer noch nicht ganz verstanden, wie du deinen Vorschlag mit dem MouseListener meinst bzw. glaube, dass es so, wie du sagst, leider auch nicht funktioniert.

Ich habe einen MouseAdapter bei der Tabelle registriert, aber das Problem scheint im Prinzip das selbe zu sein wie oben mit dem TableCellListener beschrieben:

isEditing gibt nur dann true zurück, wenn ein Doppelklick erfolgt ist. Bei einfachem Klick kann ich aber trotzdem schreiben, ohne dass isEditing true würde. Irgendwelche Ideen?

Code:
aus Init-Methode:
Code:
table.addMouseListener(new MyTableMouseListener());

Code:
private class MyTableMouseListener extends MouseAdapter {		
				
		public void mouseReleased(MouseEvent e){
			
			boolean isEditing = attr_table.isEditing();
			System.out.println("isEditing: " + isEditing);
		}
}

Gruß,
Peter
 
Hallo zusammen,

habe das Problem jetzt für mich einigermaßen zufriedenstellend gelöst:

Einzelne KeyEvents kann ich zwar nicht bekommen, wenn zuvor kein Doppelklick erfolgt ist, aber durch die Angabe der Zeile ...
Code:
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
... wird zumindest bei jeder Änderung einer Tabellenzelle ein TableModelEvent erzeugt, so dass wenigstens keine Änderungen verloren gehen.

Gruß,
Peter
 
Zurück