【问题标题】:Disable Enter Key from moving down a row in JTable禁止 Enter 键在 JTable 中向下移动一行
【发布时间】:2012-11-11 02:08:51
【问题描述】:

我需要覆盖 JTable 上的输入键功能。目前,默认行为是在用户按下“Enter”键时将行选择向下移动一行。我想禁用它并让它根据他们的选择做一些不同的事情。问题是它似乎在进入我的接受行选择的 keylistener 之前向下移动 - 因此这会打开另一个窗口,其中选择了错误的行。

这是我目前的代码...:

public class MyJTable extends JTable {


   public MyJTable(){
        setRowSelectionAllowed(true);
        addListeners()
    }

    public void addListeners(){

         addKeyListener(new KeyListener() {
                @Override
                public void keyTyped(KeyEvent e) {}

                @Override
                public void keyPressed(KeyEvent e) {}

                @Override
                public void keyReleased(KeyEvent e) {
                    int key = e.getKeyCode();
                    if (key == KeyEvent.VK_ENTER) {

                        openChannel();
                    }
                }
           });
    }

    public void openChannel(){
            for (int selectedRow : getSelectedRows()){
                //Code to open channel based on row selected
            }
        }
}

【问题讨论】:

  • KeyListener 不可行,Swing 组件使用KeyBindings。于是就有了remove方法,将KeyBindings从JTable中移除,然后添加自己的。
  • 不相关:JSomething 应该被使用 - 如果您可以通过配置达到相同的效果,请不要子类化。
  • 感谢您的回答,效果很好。 @Kleopatra,我明白,但是这个 JTable 需要扩展,这个例子只是一些测试代码,所以你可以看到问题所在。但我要牢记这一点,以备将来之用。

标签: java swing jtable keylistener key-bindings


【解决方案1】:

这是使用键绑定实现的,它优于键侦听器。我强烈建议您也这样做:用键绑定替换您的键侦听器。

解决方案是将 InputMap 中的条目替换为指向您自己的 Action(您将其插入到操作映射中),或者仅替换操作映射中的相应条目。

key bindings tutorial 包含更多信息

【讨论】:

    【解决方案2】:

    +1 @Robin 的回答

    添加到我的评论...

    Swing 使用 KeyBindings 只需通过将新的 KeyBinding 添加到 JTable 来替换现有功能(因为JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 而出现了美丽):

    private void createKeybindings(JTable table) {
    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter");
        table.getActionMap().put("Enter", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                //do something on JTable enter pressed
            }
        });
    }
    

    只需调用此方法并传递JTable 实例即可覆盖JTable 的标准功能ENTER

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2020-02-12
      • 2013-01-09
      • 2012-01-02
      相关资源
      最近更新 更多