この問題は長い間私を悩ませてきました。それは非常に厄介で、私は専門家にそれを示すサンプルを準備することができました. これをコピーして貼り付けるだけです:
public class CellBorderDemo extends JFrame
{
private JTable dataSearchResultTable;
private boolean selectRow = false;
public CellBorderDemo()
{
JPanel panel = new JPanel(new GridLayout(2, 1, 5, 10));
panel.setPreferredSize(new Dimension(500, 300));
MyTableModel myTableModel = new MyTableModel();
dataSearchResultTable = new JTable();
dataSearchResultTable.addKeyListener(new KeyAdapter()
{
private String attemptId = new String();
@Override
public void keyTyped(KeyEvent e)
{
System.out.println("selectRow=" + selectRow + " keyChar=" + (int) e.getKeyChar() + " event=" + e);
if ((e.getModifiers() == KeyEvent.CTRL_MASK && (int) e.getKeyChar() == 10)) {
System.out.println("Ctrl+J was pressed when focus was ok");
selectRow = true;
attemptId = new String();
dataSearchResultTable.editCellAt(-1, -1);
dataSearchResultTable.getSelectionModel().clearSelection();
return;
} else if ((int) e.getKeyChar() == 32) {
return;
}
if (selectRow) {
char keyChar = e.getKeyChar();
if (keyChar >= 48 && keyChar <= 57) {
attemptId += String.valueOf(keyChar);
if (selectRow(Integer.valueOf(attemptId).intValue())) {
System.out.println("attemptId=" + attemptId);
return;
}
}
selectRow = false;
attemptId = new String();
}
}
});
dataSearchResultTable.setSelectionBackground(new Color(0xbbccdd));
dataSearchResultTable.setSelectionForeground(new Color(0x333300));
dataSearchResultTable.setFillsViewportHeight(true);
dataSearchResultTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
dataSearchResultTable.setAutoCreateRowSorter(true);
dataSearchResultTable.setRowHeight(30);
dataSearchResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
dataSearchResultTable.getColumnModel().setColumnMargin(0);
dataSearchResultTable.setPreferredScrollableViewportSize(dataSearchResultTable.getPreferredSize());
dataSearchResultTable.setModel(myTableModel);
panel.add(new JScrollPane(dataSearchResultTable));
super.getContentPane().add(panel);
super.pack();
super.setDefaultCloseOperation(EXIT_ON_CLOSE);
super.setVisible(true);
}
public boolean selectRow(int attemptId)
{
MyTableModel tableModel = (MyTableModel) dataSearchResultTable.getModel();
int row = 0;
if (attemptId >= 0 && attemptId < tableModel.getRowCount()) {
System.out.println("rowToSelect=" + row);
dataSearchResultTable.setRowSelectionInterval(attemptId, attemptId);
dataSearchResultTable.setColumnSelectionInterval(2, 2);
tableModel.fireTableCellUpdated(row, 2);
dataSearchResultTable.requestFocusInWindow();
return true;
}
return false;
}
class MyTableModel extends AbstractTableModel
{
private String[] columnNames = { "First Name", "Last name", "Vegetarian" };
private Object[][] data;
int prefRow = 1, prefCol = 2;
MyTableModel()
{
data = new Object[][] { { "Vova", "KipokKipokKipokKipok", false }, { "Olia", "Duo", true },
{ "Ivan", "Brown", false } };
}
public int getColumnCount()
{
return columnNames.length;
}
public int getRowCount()
{
return data.length;
}
public String getColumnName(int col)
{
return columnNames[col];
}
public Object getValueAt(int row, int col)
{
if (data.length > 0 && data[0] != null) {
return data[row][col];
}
return null;
}
public Class getColumnClass(int c)
{
Object valueAt = getValueAt(0, c);
return valueAt == null ? Object.class : valueAt.getClass();
}
public boolean isCellEditable(int row, int col)
{
return true;
}
public void setValueAt(Object value, int row, int col)
{
if (data.length > 0 && data[0] != null) {
if (data[row][col] instanceof Boolean && (Boolean) value) {
setValueAt(false, prefRow, prefCol);
prefRow = row;
prefCol = col;
}
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
}
public static void main(String[] args) throws ParseException
{
new CellBorderDemo();
}
}
長いのはわかります。クラス MyTableModel はまったく見ないでください。keylistener と selectRow メソッドだけを見てください。ここで Ctrl+J を押してから、0 または 1 または 2 のいずれかを押してください。適切な行が選択されていることがわかります。スペースを押してチェックボックスを選択できます。ここでもう一度 Ctrl+J を押して 0 から 2 までの数字を押しますが、最初の試行とは異なるはずです。new number に従って新しい行が選択されていることがわかります。スペースを押すと、新しいセルが選択されたがフォーカスされていないという問題が表示されます。そのため、以前に選択したチェックボックスを選択解除しましたが、現在選択されていません。
この機能は非常に重要であるため、このヘルプに非常に感謝しています。
ありがとうございました!