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