2015-06-16 2 views
2

У меня есть JTable с фактически 4 столбцами и множеством строк. Теперь я хочу выбрать одну или несколько строк, нажав клавишу на клавиатуре. Но я понятия не имею, как это сделать.JTabe выбор/выделение строк (строк) нажатием клавиши на клавиатуре

Это пример того, что я хочу:

  • если я нажать «F» на клавиатуре мое приложение следует выбрать или поставьте отметку в первую строку в моей таблице, которая имеет вход, начиная с полукокса «F» (или другой i нажал
  • , если я снова нажму на ту же клавишу (здесь «F»), тогда следует выбрать или выделить следующую строку, которая имеет запись, начинающуюся с символа «F»
  • , если последняя строка и я снова нажимаю ту же клавишу, чтобы он снова или снова выбирал или выделял первую строку (цикл)
  • , когда я нажимаю другую клавишу, например «U», он должен делать то же самое со строками, начинающимися с «U», как указано выше.

ответ

2

Это звучит как интересная проблема. Поэтому я взломал что-то, что может быть основой вашего решения. Примечание. Это можно улучшить с помощью правильной инкапсуляции и дженериков. Предупреждение: используйте это только в том случае, если ваша модель данных таблицы невелика. Если он большой, вы должны рассмотреть несколько более подходящий подход для поиска, а также для параллелизма/пользовательского интерфейса, чтобы избежать замораживания вашего пользовательского интерфейса. В любом случае, решение будет в том же порядке, что и ниже. Ключ состоит в том, чтобы добавить слушателя ключей в таблицу, а затем проверить символ нажатия клавиши на значения строк/столбцов. HTH

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(); 
      } 
     }); 
    } 
} 
+0

спасибо за помощь. Я попробовал это с вашим кодом, и для моей фактической таблицы он работает почти, я хочу. Но одна из проблем заключается в следующем: когда я сортирую таблицу, щелкнув одну из своих столбцов TableHeader, ваш код перестанет работать. И еще один эмитент, которого я заметил, - это: когда я не выбираю ни одну строку и сортирую таблицу, она будет выбирать строки, но ложные, поэтому tableDataModel или что-то неверно для выбора, который он делает :(Можете ли вы добавить кусок кода, который мне нужен, что он работает, когда я сортирую свою таблицу тоже? Спасибо еще раз! :) – Opa114

+0

Привет, Обратите внимание, что при сортировке вы вмешиваетесь в саму модель. Вероятно, значение selectedRow variable становится недопустимым в этом контексте. Цель кода заключалась в том, чтобы показать, как это может быть достигнуто, и оно не распространяется на все прецеденты. Было бы полезно попытаться понять это. –

Смежные вопросы