gpt4 book ai didi

java - 如何在 swing 中将键绑定(bind)设置为可编辑的 JTable?

转载 作者:行者123 更新时间:2023-11-30 09:05:03 25 4
gpt4 key购买 nike

我想通过仅按 Delete 按钮删除选定的 JTable 行。

当我按下 Delete 时,选定的单元格变为可编辑,我的操作(在 jframe 上)没有收到 KeyEvent

请运行此演示以查看效果:

public class TestTableKeyBinding extends JFrame {

// private static final int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
private JTable table;

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
TestTableKeyBinding test = new TestTableKeyBinding();
test.setVisible(true);
}
});
}

TestTableKeyBinding() {
super();
initUI();
addKeyBindings();
}

private void initUI() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] headers = new String[] { "apples", "bananas" };
String[][] data = new String[][] { { "1", "2" }, { "4", "6" }, { "5", "7" }, { "1", "3" }, { "2", "11" } };
table = new JTable(data, headers);
table.setRowSelectionAllowed(true);
this.add(new JScrollPane(table));
this.pack();
this.setSize(new Dimension(300, 400));

}

private void addKeyBindings() {
// root maps
InputMap im = this.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = this.getRootPane().getActionMap();
// add custom action
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "save");
am.put("save", saveAction());
}

private AbstractAction saveAction() {
AbstractAction save = new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(TestTableKeyBinding.this.table, "Action Triggered.");
table.editingCanceled(null);
table.editingStopped(null);
int selectedRow = table.getSelectedRow();
if (selectedRow != -1) {
((DefaultTableModel) table.getModel()).removeRow(selectedRow);
}
}
};
return save;
}
}

感谢您的帮助!

最佳答案

我已经测试了您的代码并做了一些如下所述的更改。现在一切正常。

private void addKeyBindings() {
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
table.getActionMap().put("save", saveAction());
table.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "save");
}

再做一个如下所述的改变

table = new JTable(new DefaultTableModel(data,headers));

否则会导致下面一行的ClassCastException

((DefaultTableModel) table.getModel()).removeRow(selectedRow);

完整代码如下:

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;

public class TestTableKeyBinding extends JFrame {

private JTable table;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
TestTableKeyBinding test = new TestTableKeyBinding();
test.setVisible(true);
}
});
}

TestTableKeyBinding() {
super();
initUI();
addKeyBindings();
}

private void initUI() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] headers = new String[] { "apples", "bananas" };
String[][] data = new String[][] { { "1", "2" }, { "4", "6" }, { "5", "7" }, { "1", "3" },
{ "2", "11" } };
table = new JTable(new DefaultTableModel(data,headers));
table.setRowSelectionAllowed(true);
this.add(new JScrollPane(table));
this.pack();
this.setSize(new Dimension(300, 400));

}

private void addKeyBindings() {
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0);
table.getActionMap().put("save", saveAction());
table.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "save");
}

private AbstractAction saveAction() {
AbstractAction save = new AbstractAction() {

@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(TestTableKeyBinding.this.table, "Action Triggered.");
table.editingCanceled(null);
table.editingStopped(null);
int selectedRow = table.getSelectedRow();
if (selectedRow != -1) {
((DefaultTableModel) table.getModel()).removeRow(selectedRow);
}
}
};
return save;
}
}

关于java - 如何在 swing 中将键绑定(bind)设置为可编辑的 JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com