Java 基于多个按键更改jtable行选择

Java 基于多个按键更改jtable行选择,java,swing,select,keyboard,jtable,Java,Swing,Select,Keyboard,Jtable,我有一个JTable,实际上有6列和许多行。现在我想更改选择并通过按键盘上的一个或多个键跳转到该行 这就是我想要的例子: 如果我在键盘上按“S”,我的应用程序将选择表中的第一行,该行的条目以字符“S”开头 但是,如果我按两个键“SC”,它应该对上面以“SC”开头的行执行相同的操作 当我按下另一个键时,例如“BHM”,它应该对上面以“BHM”开头的行执行相同的操作 我已经实现了这一点,但它没有正常工作 另外,GUI在按键过多后也会冻结 这是我的完整代码 MyTable.java public

我有一个JTable,实际上有6列和许多行。现在我想更改选择并通过按键盘上的一个或多个键跳转到该行

这就是我想要的例子:

  • 如果我在键盘上按“S”,我的应用程序将选择表中的第一行,该行的条目以字符“S”开头

  • 但是,如果我按两个键“SC”,它应该对上面以“SC”开头的行执行相同的操作

  • 当我按下另一个键时,例如“BHM”,它应该对上面以“BHM”开头的行执行相同的操作

我已经实现了这一点,但它没有正常工作

另外,GUI在按键过多后也会冻结

这是我的完整代码

MyTable.java

public class MyTable extends JPanel {

public JScrollPane jScrollPane1;
public JTextField searchField;
public JTable table;
Object[] data = new Object[6];
ArrayList rows = new ArrayList();

MyTable() {
    table = new JTable();
    table.setAutoCreateRowSorter(true);
    table.setModel(new DefaultTableModel(
            new Object[][]{},
            new String[]{
                "Description", "Code", "Qty", "Cost", "Rate", "Packing"
            }
    ) {
        Class[] types = new Class[]{
            String.class, String.class, Integer.class, Double.class, Double.class, String.class
        };
        boolean[] canEdit = new boolean[]{
            false, false, false, false, false, false
        };

        public Class getColumnClass(int columnIndex) {
            return types[columnIndex];
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit[columnIndex];
        }
    });

    table.setColumnSelectionAllowed(true);
    table.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
    table.getTableHeader().setReorderingAllowed(false);

    table.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
    if (table.getColumnModel().getColumnCount() > 0) {
        table.getColumnModel().getColumn(0).setMinWidth(300);
        table.getColumnModel().getColumn(0).setPreferredWidth(300);
        table.getColumnModel().getColumn(0).setMaxWidth(1000);
        table.getColumnModel().getColumn(1).setMinWidth(100);
        table.getColumnModel().getColumn(1).setPreferredWidth(100);
        table.getColumnModel().getColumn(1).setMaxWidth(500);
        table.getColumnModel().getColumn(2).setMinWidth(50);
        table.getColumnModel().getColumn(2).setPreferredWidth(50);
        table.getColumnModel().getColumn(2).setMaxWidth(100);
        table.getColumnModel().getColumn(3).setMinWidth(80);
        table.getColumnModel().getColumn(3).setPreferredWidth(80);
        table.getColumnModel().getColumn(3).setMaxWidth(200);
        table.getColumnModel().getColumn(4).setMinWidth(80);
        table.getColumnModel().getColumn(4).setPreferredWidth(80);
        table.getColumnModel().getColumn(4).setMaxWidth(200);
        table.getColumnModel().getColumn(5).setMinWidth(80);
        table.getColumnModel().getColumn(5).setPreferredWidth(80);
        table.getColumnModel().getColumn(5).setMaxWidth(200);
    }
    table.setPreferredScrollableViewportSize(new Dimension(800, 600));
    table.setFillsViewportHeight(true);
    table.setRowHeight(30);
    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);
    table.addKeyListener(new SearchingKeyAdapter(table));
    addRowData();
    table.changeSelection(0, 0, false, false);
}

private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("MyTable");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    MyTable newContentPane = new MyTable();
    newContentPane.setOpaque(true);
    frame.setContentPane(newContentPane);


    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

private void addRowData() {
    String desc = "SL 123";
    Integer code = 12345;
    Integer qty = 10;
    Double rate = new Double(1000);
    Double cost = new Double(900);
    String pack = "10x10x10";
    data[0] = desc;
    data[1] = code;
    data[2] = qty;
    data[3] = cost;
    data[4] = rate;
    data[5] = pack;
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    for (int i = 0; i < 5; i++) {
        data[0] = "SL " + i;
        rows.add(data);
        model.addRow(data);
    }
    rows.clear();
    for (int i = 0; i < 5; i++) {
        data[0] = "SC " + i;
        rows.add(data);
        model.addRow(data);
    }
    data[0] = "AP";
    model.addRow(data);
    data[0] = "GP";
    model.addRow(data);
    data[0] = "PS";
    model.addRow(data);
    data[0] = "PP";
    model.addRow(data);
    data[0] = "BHM";
    model.addRow(data);
    data[0] = "BGP";
    model.addRow(data);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}
public class SearchingKeyAdapter extends KeyAdapter {

String key = "";
private final JTable table;
private int selectedRow = -1;//before start

public SearchingKeyAdapter(JTable table) {
    this.table = table;
}

@Override
public void keyPressed(KeyEvent e) {
    key += String.valueOf(e.getKeyChar());
}

@Override
public void keyReleased(KeyEvent e) {
    String keyChar = key.toUpperCase();
    key = "";
    TableModel model = table.getModel();
    int startRow = selectedRow;
    if (selectedRow == model.getRowCount() - 1) {
        startRow = -1;//Go before start
    }
    int col = 0;
    for (int row = startRow + 1; row < model.getRowCount(); row++) {
        String value = (String) model.getValueAt(row, col);
        if (value != null && !value.isEmpty() && value.toUpperCase().startsWith(keyChar)) {
            table.getSelectionModel().clearSelection();
            table.getColumnModel().getSelectionModel().clearSelection();
            table.setRowSelectionInterval(row, row);
            table.changeSelection(row, col, false, false);
            selectedRow = row;
            return;
        }
    }
}
}
公共类MyTable扩展了JPanel{
公共JScrollPane jScrollPane1;
公共JTextField搜索字段;
公共JTable表;
对象[]数据=新对象[6];
ArrayList行=新的ArrayList();
MyTable(){
table=新的JTable();
表.setAutoCreateRowSorter(真);
table.setModel(新的DefaultTableModel(
新对象[][]{},
新字符串[]{
“说明”、“代码”、“数量”、“成本”、“费率”、“包装”
}
) {
类[]类型=新类[]{
String.class,String.class,Integer.class,Double.class,Double.class,String.class
};
boolean[]canEdit=新的boolean[]{
假,假,假,假,假,假,假
};
公共类getColumnClass(int columnIndex){
返回类型[列索引];
}
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
返回canEdit[columnIndex];
}
});
table.setColumnSelectionAllowed(真);
setCursor(新java.awt.Cursor(java.awt.Cursor.DEFAULT_Cursor));
table.getTableHeader().setReorderingAllowed(false);
table.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
如果(table.getColumnModel().getColumnCount()>0){
table.getColumnModel().getColumn(0).setMinWidth(300);
table.getColumnModel().getColumn(0).setPreferredWidth(300);
table.getColumnModel().getColumn(0.setMaxWidth(1000);
table.getColumnModel().getColumn(1).setMinWidth(100);
table.getColumnModel().getColumn(1).setPreferredWidth(100);
table.getColumnModel().getColumn(1).setMaxWidth(500);
table.getColumnModel().getColumn(2).setMinWidth(50);
table.getColumnModel().getColumn(2).setPreferredWidth(50);
table.getColumnModel().getColumn(2).setMaxWidth(100);
table.getColumnModel().getColumn(3).setMinWidth(80);
table.getColumnModel().getColumn(3).setPreferredWidth(80);
table.getColumnModel().getColumn(3).setMaxWidth(200);
table.getColumnModel().getColumn(4).setMinWidth(80);
table.getColumnModel().getColumn(4).setPreferredWidth(80);
table.getColumnModel().getColumn(4).setMaxWidth(200);
table.getColumnModel().getColumn(5).setMinWidth(80);
table.getColumnModel().getColumn(5).setPreferredWidth(80);
table.getColumnModel().getColumn(5).setMaxWidth(200);
}
table.setPreferredScrollableViewportSize(新维度(800600));
表.setFillsViewPerthweight(真);
表3.设置行高(30);
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
addKeyListener(新的SearchKeyAdapter(表));
addRowData();
表.changeSelection(0,0,false,false);
}
私有静态void createAndShowGUI(){
//创建并设置窗口。
JFrame=新JFrame(“MyTable”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建并设置内容窗格。
MyTable newContentPane=新建MyTable();
newContentPane.set不透明(true);
frame.setContentPane(newContentPane);
//显示窗口。
frame.pack();
frame.setVisible(true);
}
私有void addRowData(){
字符串desc=“SL 123”;
整数代码=12345;
整数数量=10;
双倍费率=新双倍(1000);
双倍成本=新双倍(900);
字符串包=“10x10x10”;
数据[0]=描述;
数据[1]=代码;
数据[2]=数量;
数据[3]=成本;
数据[4]=速率;
数据[5]=包装;
DefaultTableModel=(DefaultTableModel)table.getModel();
对于(int i=0;i<5;i++){
数据[0]=“SL”+i;
行。添加(数据);
model.addRow(数据);
}
行。清除();
对于(int i=0;i<5;i++){
数据[0]=“SC”+i;
行。添加(数据);
model.addRow(数据);
}
数据[0]=“AP”;
model.addRow(数据);
数据[0]=“GP”;
model.addRow(数据);
数据[0]=“PS”;
model.addRow(数据);
数据[0]=“PP”;
model.addRow(数据);
数据[0]=“BHM”;
model.addRow(数据);
数据[0]=“BGP”;
model.addRow(数据);
}
公共静态void main(字符串[]args){
//为事件调度线程计划作业:
//创建并显示此应用程序的GUI。
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}
}
SearchingKeyAdapter.java

public class MyTable extends JPanel {

public JScrollPane jScrollPane1;
public JTextField searchField;
public JTable table;
Object[] data = new Object[6];
ArrayList rows = new ArrayList();

MyTable() {
    table = new JTable();
    table.setAutoCreateRowSorter(true);
    table.setModel(new DefaultTableModel(
            new Object[][]{},
            new String[]{
                "Description", "Code", "Qty", "Cost", "Rate", "Packing"
            }
    ) {
        Class[] types = new Class[]{
            String.class, String.class, Integer.class, Double.class, Double.class, String.class
        };
        boolean[] canEdit = new boolean[]{
            false, false, false, false, false, false
        };

        public Class getColumnClass(int columnIndex) {
            return types[columnIndex];
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit[columnIndex];
        }
    });

    table.setColumnSelectionAllowed(true);
    table.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
    table.getTableHeader().setReorderingAllowed(false);

    table.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
    if (table.getColumnModel().getColumnCount() > 0) {
        table.getColumnModel().getColumn(0).setMinWidth(300);
        table.getColumnModel().getColumn(0).setPreferredWidth(300);
        table.getColumnModel().getColumn(0).setMaxWidth(1000);
        table.getColumnModel().getColumn(1).setMinWidth(100);
        table.getColumnModel().getColumn(1).setPreferredWidth(100);
        table.getColumnModel().getColumn(1).setMaxWidth(500);
        table.getColumnModel().getColumn(2).setMinWidth(50);
        table.getColumnModel().getColumn(2).setPreferredWidth(50);
        table.getColumnModel().getColumn(2).setMaxWidth(100);
        table.getColumnModel().getColumn(3).setMinWidth(80);
        table.getColumnModel().getColumn(3).setPreferredWidth(80);
        table.getColumnModel().getColumn(3).setMaxWidth(200);
        table.getColumnModel().getColumn(4).setMinWidth(80);
        table.getColumnModel().getColumn(4).setPreferredWidth(80);
        table.getColumnModel().getColumn(4).setMaxWidth(200);
        table.getColumnModel().getColumn(5).setMinWidth(80);
        table.getColumnModel().getColumn(5).setPreferredWidth(80);
        table.getColumnModel().getColumn(5).setMaxWidth(200);
    }
    table.setPreferredScrollableViewportSize(new Dimension(800, 600));
    table.setFillsViewportHeight(true);
    table.setRowHeight(30);
    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);
    table.addKeyListener(new SearchingKeyAdapter(table));
    addRowData();
    table.changeSelection(0, 0, false, false);
}

private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("MyTable");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    MyTable newContentPane = new MyTable();
    newContentPane.setOpaque(true);
    frame.setContentPane(newContentPane);


    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

private void addRowData() {
    String desc = "SL 123";
    Integer code = 12345;
    Integer qty = 10;
    Double rate = new Double(1000);
    Double cost = new Double(900);
    String pack = "10x10x10";
    data[0] = desc;
    data[1] = code;
    data[2] = qty;
    data[3] = cost;
    data[4] = rate;
    data[5] = pack;
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    for (int i = 0; i < 5; i++) {
        data[0] = "SL " + i;
        rows.add(data);
        model.addRow(data);
    }
    rows.clear();
    for (int i = 0; i < 5; i++) {
        data[0] = "SC " + i;
        rows.add(data);
        model.addRow(data);
    }
    data[0] = "AP";
    model.addRow(data);
    data[0] = "GP";
    model.addRow(data);
    data[0] = "PS";
    model.addRow(data);
    data[0] = "PP";
    model.addRow(data);
    data[0] = "BHM";
    model.addRow(data);
    data[0] = "BGP";
    model.addRow(data);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}
public class SearchingKeyAdapter extends KeyAdapter {

String key = "";
private final JTable table;
private int selectedRow = -1;//before start

public SearchingKeyAdapter(JTable table) {
    this.table = table;
}

@Override
public void keyPressed(KeyEvent e) {
    key += String.valueOf(e.getKeyChar());
}

@Override
public void keyReleased(KeyEvent e) {
    String keyChar = key.toUpperCase();
    key = "";
    TableModel model = table.getModel();
    int startRow = selectedRow;
    if (selectedRow == model.getRowCount() - 1) {
        startRow = -1;//Go before start
    }
    int col = 0;
    for (int row = startRow + 1; row < model.getRowCount(); row++) {
        String value = (String) model.getValueAt(row, col);
        if (value != null && !value.isEmpty() && value.toUpperCase().startsWith(keyChar)) {
            table.getSelectionModel().clearSelection();
            table.getColumnModel().getSelectionModel().clearSelection();
            table.setRowSelectionInterval(row, row);
            table.changeSelection(row, col, false, false);
            selectedRow = row;
            return;
        }
    }
}
}
公共类SearchingKeyAdapter扩展了KeyAdapter{
字符串键=”;
专用最终JTable表;
private int selectedRow=-1;//开始前
public SearchingKeyAdapter(JTable表){
this.table=表格;
}
@凌驾
按下公共无效键(按键事件e){
key+=String.valueOf(例如getKeyChar());
}
@凌驾
公共无效密钥已释放(密钥事件e){
字符串keyChar=key.toUpperCase();
key=“”;
TableModel模型=table.getModel();
int startRow=selectedRow;
if(selectedRow==model.getRowCount()-1){
startRow=-1;//开始前进行
}
int col=0;
对于(int row=startRow+1;row