Java j按键盘上的键选择/突出显示行
我有一个JTable,实际上有4列和许多行。现在我想通过按键盘上的键来选择一行或多行。但我不知道该怎么做 这就是我想要的例子:Java j按键盘上的键选择/突出显示行,java,select,keyboard,jtable,highlight,Java,Select,Keyboard,Jtable,Highlight,我有一个JTable,实际上有4列和许多行。现在我想通过按键盘上的键来选择一行或多行。但我不知道该怎么做 这就是我想要的例子: 如果我在键盘上按“F”,我的应用程序将选择或高亮显示表格中的第一行,该行的条目以字符“F”开头(或我按的另一行) 如果我再次按同一个键(此处为“F”),则is应选择或突出显示下一行,该行的条目以字符“F”开头 如果选择了最后一行,我再次按同一个键,它将再次选择或高亮显示第一行(循环) 当我按下另一个键时,例如“U”,它应该对上面以“U”开头的行执行相同的操作 这听起来
- 如果我在键盘上按“F”,我的应用程序将选择或高亮显示表格中的第一行,该行的条目以字符“F”开头(或我按的另一行)
- 如果我再次按同一个键(此处为“F”),则is应选择或突出显示下一行,该行的条目以字符“F”开头
- 如果选择了最后一行,我再次按同一个键,它将再次选择或高亮显示第一行(循环)
- 当我按下另一个键时,例如“U”,它应该对上面以“U”开头的行执行相同的操作
package example;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
/** Extend default model to make cells non-editable */
class MyTableModel extends DefaultTableModel {
public MyTableModel(Object[][] data, Object[] headers) {
super(data, headers);
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
}
/** Key listener that controls row highlighting */
class SearchingKeyAdapter extends KeyAdapter {
private final JTable table;
private int selectedRow = -1;//before start
public SearchingKeyAdapter(JTable table) {
this.table = table;
}
@Override
public void keyReleased(KeyEvent e) {
String keyChar = String.valueOf(e.getKeyChar());
TableModel model = table.getModel();
int startRow = selectedRow;
if (selectedRow == model.getRowCount() - 1) {
startRow = -1;//Go before start
}
//Check each cell to see if it starts with typed char.
//if so set corresponding row selected and return.
for (int row = startRow+1; row < model.getRowCount(); row++) {
for (int col = 0; col < model.getColumnCount(); col++) {
String value = (String) model.getValueAt(row, col);
if (value != null && value.startsWith(keyChar)) {
table.getSelectionModel().clearSelection();
table.getColumnModel().getSelectionModel().clearSelection();
table.setRowSelectionInterval(row, row);
selectedRow = row;
return;
}
}
}
}
}
public class App {
JFrame frame;
JTable table;
String[][] data = {
{"for", "util", "synchronized", "final"}, {"finally", "throw", "throws", "try"}, {"import", "class", "interface", "if"}, {"public", "private", "protected", "volatile"}
};
String[] headers = {"Keyword1", "Keyword2", "Keyword3", "Keyword3"};
public App() {
table = new JTable();
table.setModel(new MyTableModel(data, headers));
//Add special key listener that will move highlight based on typed char
table.addKeyListener(new SearchingKeyAdapter(table));
//We need to have only single selection
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
frame = new JFrame();
frame.setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table);
frame.getContentPane().add(scrollPane);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
App app = new App();
}
});
}
}
包示例;
导入javax.swing.*;
导入javax.swing.table.DefaultTableModel;
导入javax.swing.table.TableModel;
导入java.awt.*;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
/**扩展默认模型以使单元格不可编辑*/
类MyTableModel扩展了DefaultTableModel{
公共MyTableModel(对象[][]数据,对象[]头){
超级(数据、标题);
}
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
}
/**控制行高亮显示的键侦听器*/
类SearchingKeyAdapter扩展了KeyAdapter{
专用最终JTable表;
private int selectedRow=-1;//开始前
public SearchingKeyAdapter(JTable表){
this.table=表格;
}
@凌驾
公共无效密钥已释放(密钥事件e){
String keyChar=String.valueOf(例如getKeyChar());
TableModel模型=table.getModel();
int startRow=selectedRow;
if(selectedRow==model.getRowCount()-1){
startRow=-1;//开始前进行
}
//检查每个单元格是否以键入的字符开头。
//如果是,则设置相应的选定行并返回。
对于(int row=startRow+1;row
谢谢你的帮助。我用你的代码试过了,对于我的实际表格,它几乎可以正常工作。但一个问题是:当我通过单击我的一个tableHeader列对表格进行排序时,你的代码停止工作。我注意到的另一个问题是:当我不选择任何行并对表格进行排序时,它将选择行,但选择错误的行,因此tableDataModel或其他东西对它所做的选择不正确:(当我对我的表进行排序时,你能添加我需要的代码吗?再次感谢!)您好,请注意,当您排序时,您正在干预模型本身。因此,selectedRow变量值在该上下文中很可能变得无效。代码的目的是展示如何实现这一点,但它并没有涵盖所有用例。您值得尝试并弄清楚这一点。