JTableに個別のセルではなく行全体を強制的にフォーカスさせる方法はありますか?私は行の選択のハイライトについて話しているわけではなく、フォーカスされた行にすべてのセルを含めるフォーカス境界についてのみです。セルの代わりに全行にJTableをフォーカス
UPDATE:
":
public class TableTest {
private static void createAndShowGUI() {
int rows = 20;
int cols = 2;
String[] headers = { "Column 1", "Column 2" };
String[][] data = new String[rows][cols];
for (int j = 0; j < rows; j++)
for (int k = 0; k < cols; k++)
data[j][k] = "item " + (j * cols + k + 1);
JTable table = new JTable();
DefaultTableModel tableModel = new DefaultTableModel(data, headers) {
// Disable editing of the cells
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table.setModel(tableModel);
table.setShowGrid(false);
table.setIntercellSpacing(new Dimension(0,0));
// key binding to remove rows
InputMap inputMap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap actionMap = table.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "REMOVE");
actionMap.put("REMOVE", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
int[] rows = table.getSelectedRows();
for (int i = rows.length - 1; i >= 0; i--) {
tableModel.removeRow(rows[i]);
}
}
});
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(table));
f.setSize(500, 500);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
//UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {}
createAndShowGUI();
}
});
}
}
が選択された行の "境界フォーカス":編集不可セルと削除-行機能を持つ
表選択された行がない「フォーカス枠」:
WindowsのLAFで "国境をフォーカス":
私は、行のすべてのセル(ときに表示)を含めるには、この "フォーカス枠を" 欲しいです。
public class TableTest {
private static void createAndShowGUI() {
int rows = 20;
int cols = 2;
String[] headers = { "Column 1", "Column 2" };
String[][] data = new String[rows][cols];
for (int j = 0; j < rows; j++)
for (int k = 0; k < cols; k++)
data[j][k] = "item " + (j * cols + k + 1);
// ADDED CODE
JTable table = new JTable() {
private Border outside = new MatteBorder(1, 0, 1, 0, Color.BLACK);
private Border inside = new EmptyBorder(0, 1, 0, 1);
private Border border = new CompoundBorder(outside, inside);
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
JComponent jc = (JComponent) c;
// Add a border to the selected row
if (isRowSelected(row)) jc.setBorder(border);
return c;
}
};
DefaultTableModel tableModel = new DefaultTableModel(data, headers) {
// Disable editing of the cells
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
table.setModel(tableModel);
table.setShowGrid(false);
table.setIntercellSpacing(new Dimension(0,0));
// key binding to remove rows
InputMap inputMap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap actionMap = table.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "REMOVE");
actionMap.put("REMOVE", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
int[] rows = table.getSelectedRows();
for (int i = rows.length - 1; i >= 0; i--) {
tableModel.removeRow(rows[i]);
}
}
});
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(table));
f.setSize(500, 500);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
//UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {}
createAndShowGUI();
}
});
}
}
これは行全体の周りに境界線を追加する(しかし、すべての細胞を含むことのない左/右の挿入図とともに):
以下は同じコードであるが、私は@camickrのコードの一部を追加しました。これは「フォーカスの境界線/矩形」ではなく、選択した行の周囲にのみ表示される境界線です。行を削除すると、選択した行が消去され、フォーカス枠が再表示されます。私はない(私はそれを行う方法を知っている)、フォーカス枠を非表示にするか、私はそれが見えるようになったときに代わりに、一つのセルの行のすべてのセルを含めるが、そのように機能しておきたいこと
注意。
行フォーカス全体の意味は?キーボード入力はどこに行かなければならないのですか?それとも、表示上の問題で、行全体に 'FocusBorder'を表示したいのですか? – kgeorgiy
私は、行全体にFocusBorderを表示したいだけです。セルは編集不可能なbtwです。 – AndroidX
いいえ、ここでは、入力を開始するときにキーボード入力をどこに表示するかを示します。あなたが望むことを行うことは大会に反するものであり、フレームワークには組み込まれていません。唯一のオプションは、各列のカスタムセルレンダラーでフォーカスの枠線を描画することです。列がユーザーによって再配置されるように、この一般的なケースでは正しく機能するにはこのトリッキーです。もっと簡単な解決策は、JTableをまったく使用せず、代わりに単一のカスタムセルレンダラーでJListを使用することです。 –