wie die Kontrolle Fokus in JTable
-
05-07-2019 - |
Frage
Was ich will, ist tun, wenn der Benutzer Finish Bearbeitung von Daten in Tabellenzelle Fokus auf eine andere Zelle in Abhängigkeit davon, welche Benutzer eingegeben zu bewegen, und die Zelle in den Bearbeitungsmodus zu drehen, so Benutzer sofort und ohne zusätzliche Aktion Eingabe beginnen. Auf diese Weise können Benutzer auf seine Arbeit konzentrieren und Software tun sollte das ‚Denken‘, um die Zelle neben bearbeitet werden.
Einfache Aufgabe, die nicht so einfach sieht im wirklichen Leben ... jemand eine Idee?
Lösung
Bitte versuchen Sie dieses Beispiel.
Es sollte können Sie durch die Tabelle navigieren, indem Sie die Eingabe von Werten u, d, l, r für oben, unten, links, rechts.
Ich hoffe, dass dies wird Ihnen eine Vorstellung davon, wie es zu tun.
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class Test extends JFrame {
private JTable table;
private TableModel tableModel;
public Test() {
tableModel = new DefaultTableModel(5, 5);
table = new JTable(tableModel);
table.setColumnSelectionAllowed(true);
getContentPane().add(table);
Action handleEnter = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
table.getCellEditor().stopCellEditing(); // store user input
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
String val = String.valueOf(table.getValueAt(row, col)).toLowerCase();
if (val.equals("u"))
--row;
else if (val.equals("d"))
++row;
else if (val.equals("l"))
--col;
else if (val.equals("r"))
++col;
if ( row >= 0 && row < tableModel.getRowCount()
&& col >= 0 && col < tableModel.getColumnCount()) {
table.changeSelection(row, col, false, false);
table.editCellAt(row, col);
}
}
};
// replace action for ENTER, since next row would be selected automatically
table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "handleEnter");
table.getActionMap().put("handleEnter", handleEnter);
}
public static void main(String[] args) {
Test test = new Test();
test.setSize(800, 600);
test.setVisible(true);
}
}
Andere Tipps
Sie sollten eine KeyListener zum JTable fügen Sie alle eingegebenen Zeichen zu erhalten. Nachdem der Benutzer drückt Enter , sollten Sie das Wort prüfen der Benutzer eingegeben hat.
Schreiben Sie Ihre eigene FocusTraversalPolicy
es auf die Tabelle zu setzen
table.setFocusTraversalPolicy(policy)
Die FocusTraversalPolicy
beschreibt, welche Komponente den nächsten Fokus erhält.
Danach können Sie anrufen
FocusManager.getCurrentManager().focusNextComponent();
EDIT:. Ich habe das nicht testen, es ist nur eine Idee