私がやりたいのは、ユーザーがテーブルセルのデータの編集を終了して、入力したユーザーに応じてフォーカスを別のセルに移動し、そのセルを編集モードにして、ユーザーが追加のアクションなしですぐに入力を開始できるようにすることです。このようにして、ユーザーは自分の作業に集中でき、ソフトウェアは次に編集するセルについて「考える」ことができます。
実生活ではそれほど単純に見えない単純なタスク...誰かアイデアはありますか?
私がやりたいのは、ユーザーがテーブルセルのデータの編集を終了して、入力したユーザーに応じてフォーカスを別のセルに移動し、そのセルを編集モードにして、ユーザーが追加のアクションなしですぐに入力を開始できるようにすることです。このようにして、ユーザーは自分の作業に集中でき、ソフトウェアは次に編集するセルについて「考える」ことができます。
実生活ではそれほど単純に見えない単純なタスク...誰かアイデアはありますか?
この例を試してみてください。
上、下、左、右の値 u、d、l、r を入力して、テーブルをナビゲートできるようにする必要があります。
これにより、その方法についてのアイデアが得られることを願っています。
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);
}
}
入力されたすべての文字を取得するには、JTable に KeyListener を追加する必要があります。ユーザーが を押した後、ユーザーEnterが入力した単語を確認する必要があります。
独自FocusTraversalPolicy
に記述してテーブルに設定します
table.setFocusTraversalPolicy(policy)
はFocusTraversalPolicy
、次のフォーカスを取得するコンポーネントを示します。この後、あなたは呼び出すことができます
FocusManager.getCurrentManager().focusNextComponent();
編集:これはテストしていません。これは単なるアイデアです。