package tableDemo;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TabellenNavigation_2 extends JFrame {
public TabellenNavigation_2() {
setTitle("Tabellennavigation");
setDefaultCloseOperation( EXIT_ON_CLOSE );
setSize(400,300);
setLocationRelativeTo( null );
tabelle = new JTable(15, 5) {
public boolean isCellEditable(int zeile, int spalte) {
return spalte > 1;//ab dritte Zelle -> editierbar
}
};
String[] namen = new String[]{"a", "b","c","d","e","f","g","h","i","j",
"k","l","m","n","o",};
for (int i = 0; i < tabelle.getRowCount(); i++) {
tabelle.setValueAt(namen[i],i,0);
}
getContentPane().add( new JScrollPane( tabelle ) );
InputMap im = tabelle.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
// "Enter"-Taste bekommt die Funktion der "Tab"-Taste
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);
// Die Taste "Rechter-Pfeil" ausblenden
KeyStroke rechts = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
im.put(rechts, "none");
// Die Taste "Linker-Pfeil" ausblenden
KeyStroke links = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
im.put(links, "none");
// 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 = tabelle.getActionMap().get(tabFunktion);
Action tabAktion = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
alteTabAktion.actionPerformed( e );
JTable tabelle = (JTable)e.getSource();
int zeilenAnzahl = tabelle.getRowCount();
int spaltenAnzahl = tabelle.getColumnCount();
int zeile = tabelle.getSelectedRow();
int spalte = tabelle.getSelectedColumn();
while (! tabelle.isCellEditable(zeile, spalte) ) {
spalte++;
if (spalte == spaltenAnzahl) {
spalte = 0;
zeile++;
}
if (zeile == zeilenAnzahl) {
zeile = 0;
}
// Zurück zum Startpunkt, rausgehen.
// (für den Fall wo keine Zelle editierbar ist)
if (zeile == tabelle.getSelectedRow()
&& spalte == tabelle.getSelectedColumn()) {
break;
}
}
tabelle.changeSelection(zeile, spalte, false, false);
}
};
tabelle.getActionMap().put(tabFunktion, tabAktion);
tabelle.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e){
enterKeyReleased(e);
}
});
tabelle.changeSelection(0,2,false,false);
setVisible(true);
edit(tabelle.getSelectedRow(), tabelle.getSelectedColumn());
}
private void enterKeyReleased(KeyEvent e){
edit(tabelle.getSelectedRow(), tabelle.getSelectedColumn());
}
private void edit(int row, int column){
if(tabelle.getColumnClass(column) == Object.class){
tabelle.editCellAt(row, tabelle.getSelectedColumn());
if(tabelle.getCellEditor()!=null){
tabelle.getEditorComponent().requestFocusInWindow();
JTextField text = (JTextField)tabelle.getEditorComponent();
text.selectAll();
}
}
}
private JTable tabelle;
public static void main(String[] args) { new TabellenNavigation_2();}
}