Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich habe eine JTable und möchte erreichen, dass bei betätigen der Tabulator-Taste am Ende der Tabelle automatisch eine neue leere Zeile eingefügt wird und der Fokus in die erste Spalte der neuen Zeile gesetzt wird. Wie kann ich das realisieren? Gibt es einen Listener mit dem das umzusetzen ist?
Vielen Dank
Wie wäre es, wenn du die Tabelle mit einem KeyListener verbindest(z.B. eine Innere Klasse MyKeyListener implements KeyListener) und dort das Tab-Key abfängst. Dann prüfst du die Position in der Tabelle und wenns letzte Zeile und Spalte ist, gibst du der Tabelle eine neue Zeile positionierst den Focus auf neueZeile erste Spalte!
Alternativ kannst du das auch mit dem KeyAdapter machen..
Hi,
danke, der KeyListener hilft mir auf jeden Fall weiter. Es funktioniert jetzt auch, wenn ich eine Eingabe in dem Feld mache und anschließend den Tabulator drücke, wenn ich aber keine neue Eingabe mache, komme ich bei Eingabe des Tabulators wieder an den Anfang der Tabelle. Benötige ich evtl. die Methode
Java:
table.setFocusTraversalKeysEnabled(false);
? Ich habe sie vor meinem Eventhandler gesetzt, bemerke aber keinerlei Veränderung. Die Methode habe ich auch noch nicht wirklich verstanden. Aber ich habe irgendwas gelesen, dass Tabulator und Eingabe-Taste eine Ausnahme bilden, da sie ja bereits zum springen in der Tabelle verwendet werden.
Ich glaube zwar nicht, dass es hilft aber hier mein Quellcode:
Java:
table.setFocusTraversalKeysEnabled(true);
//Key-Event fängt "Tabulator" in der letzten Zelle ab und legt ggf. neue Zeile an.
table.addKeyListener(
new KeyListener(){
public void keyPressed(KeyEvent e) {
//falls letztes Feld in der Tabelle
if(table.getEditingColumn() == table.getColumnCount()-1 &&
table.getEditingRow() == table.getRowCount()-1){
//falls Tabulator gedrückt wird
if(e.getKeyCode() == 9){
Object[] data = {tableModel.getRowCount()+1,"", ""};
tableModel.addRow(data);
}
}
}
public void keyReleased(KeyEvent arg0) {
}
public void keyTyped(KeyEvent arg0) {
}
});
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
public class Main_Table extends JFrame {
/**
* @param args
*/
private JTable table;
private JScrollPane sp_table;
private DefaultTableModel dtm;
public Main_Table() throws HeadlessException {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//this.setLayout(null);
this.setSize(200,200);
dtm = new DefaultTableModel(1,3){
@Override
public String getColumnName(int column) {
switch(column){
case 0: return "Spalte1";
case 1: return "Spalte2";
case 2: return "Spalte3";
}
return super.getColumnName(column);
}
};
table = new JTable(dtm);
table.addKeyListener(new MyKeyListener());
sp_table = new JScrollPane(table);
this.add(sp_table);
this.pack();
}
public static void main(String[] args) {
Main_Table mt = new Main_Table();
mt.setVisible(true);
}
public class MyKeyListener implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_TAB){
if((table.getSelectedColumn()==(table.getColumnCount()-1))&&(table.getSelectedRow()==(table.getRowCount()-1))){
String[]data = {"","",""};
dtm.addRow(data);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
}
Es funktioniert mit vorheriger Eingabe als auch ohne..
Nachtrag:
Musste Feststellen das wenn eine Änderung in der letzten Zelle mit Enter abgeschlossen wird, er wieder in die 1. Zelle springt..
Wenn kein Abschluss mit Enter dann funkt. es so!!
Also muss man auch Enter-Event abfangen..
ich suche mal weiter für dich!!
Hi,
vielen Dank für deine Bemühungen, hat mir echt geholfen. Ich werde die Eingabetaste einfach auch noch mit abfangen. Die Inputmap der Tabelle umschreiben erscheint mir etwas übertrieben.
Danke