【问题标题】:Cancel table selection when escape key pressed按下退出键时取消表格选择
【发布时间】:2018-06-04 08:55:55
【问题描述】:

我正在用 Java 编写一个 Swing 项目,最近偶然发现了一个问题。

我有一个充满对象的JTable(满是汽车的停车场),这段代码改变了两个元素的位置。如果没有选择汽车,则设置第一辆汽车的坐标。在下一次单击时,如果已经选择了一辆汽车,则设置另一辆汽车的坐标。接下来,将元素相互交换并擦除坐标。

现在,我还必须实现“取消”我的选择的可能性,例如选择第一辆车后,如果按下某个键,则应删除选择。有什么想法我该怎么做?

    jt.addMouseListener(new java.awt.event.MouseAdapter() {
        int y1 = -1;
        int x1 = -1;
        public void mouseReleased(java.awt.event.MouseEvent e) {
            if(x1 == -1 && y1 == -1) {
                y1 = jt.rowAtPoint(e.getPoint());
                x1 = jt.columnAtPoint(e.getPoint());
            } 
            else {
                int y2 = jt.rowAtPoint(e.getPoint());
                int x2 = jt.columnAtPoint(e.getPoint());

                Car tmp = (Car)carpark[y1][x1];
                carpark[y1][x1] = carpark[y2][x2];
                carpark[y2][x2] = tmp;

                model.fireTableDataChanged();

                x1 = -1;
                y1 = -1;
                y2 = -1;
                x2 = -1;
            }
        }
    });

【问题讨论】:

  • 你需要一个'class KeyPressed implements KeyListener`,你可以看到按键并决定做什么。
  • @cliff2310:不,这是一个 Swing GUI,应该避免使用 KeyListener。
  • @Hovercraft Full Of Eels 好吧,我用它们没有问题,但我屈服于你的广博知识。你能给我一些参考吗?
  • @cliff2310:首先KeyListener Tutorial 明确建议支持键绑定。如需与文本组件一起使用,请阅读MadProgrammer's answer,然后对其进行投票。

标签: java swing jtable key pressed


【解决方案1】:

How to Use Key Bindings
这里有一些东西可以帮助你开始:

InputMap im = table.getInputMap();
ActionMap am = table.getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
am.put("cancel", new CancelAction());

CancelAction 定义为:

class CancelAction extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent e) {
       System.out.println("esc button pressed ");
    }
}

【讨论】:

    【解决方案2】:

    您需要一个 GUI 组件,例如 JTextField,它可以注册 KeyListener 并编写适当的操作:请参阅 documentation

    类似:

    JTextField tf = new JTextField();
    tf.addKeyListener(
        new KeyListener() {
                void keyPressed(KeyEvent e) {
                    // your stuff here
                }
                // other methods must be overriden
        }
    );
    

    您也可以为按钮和面板等其他组件注册键监听器。

    【讨论】:

    • 不,您永远不应该将 KeyListener 添加到文本组件中。请搜索类似的问题,尤其是 MadProgrammer 和 Camickr 回答的问题,这两个问题是本网站上最好的 Swing 编码器之一。
    • 改为使用 DocumentListener 或 DocumentFilter 或 Key Bindings。
    • 我对 Swing 有点过时了。无论如何,尽管有更好的解决方案,但 KeyListener 仍然有效。
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2011-04-01
    • 2020-10-20
    • 2021-02-23
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多