【问题标题】:Use Enter Key Act Like Tab Key on jTable在 jTable 上使用 Enter 键就像 Tab 键一样
【发布时间】:2014-07-02 03:41:42
【问题描述】:

我在我的项目中被困 2 天,我无法实现如何使 ENTER KEYTAB KEY 我试过 key listener 但是 ENTER KEY 具有 JTable 的默认功能,因此它无法正常工作,它会继续向下移动。我google 它发现我需要使用 key binding 但我无法实现它。

谁能在 JTable 上给我一个完整的代码示例???请需要你的帮助。

提前致谢

【问题讨论】:

  • 尽管有可能,但我不会为下一个单元格锁定 ENTER 键,您必须(复杂)覆盖 TableCellEditor 的 stopCellEditing,不要混淆用户,让对于鲸鱼和使用标准,相同的命令在 MsExcel 等中......
  • 我想使用回车键,因为我想限制使用的键数!!按回车键移动下一个单元格并执行任何操作,例如单击按钮!
  • 为什么要大喊大叫,肯定这个决定是公正的,只是up_to_you

标签: java swing tabs jtable enter


【解决方案1】:

基本的转变是使用键绑定 API,在大多数情况下,这将允许您覆盖许多组件上的默认行为键。

此示例基本上将相同命名的操作应用于 EnterTab 键,这使得通过使用单个 Action 可以轻松修改它们的行为。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class Test101 {

    public static void main(String[] args) {
        new Test101();
    }

    public Test101() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JTable table = new JTable();
                InputMap im = table.getInputMap();
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Action.NextCell");
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextCell");

                ActionMap am = table.getActionMap();
                am.put("Action.NextCell", new NextCellActioin(table));

                DefaultTableModel model = new DefaultTableModel(10, 10);
                table.setModel(model);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class NextCellActioin extends AbstractAction {

        private JTable table;

        public NextCellActioin(JTable table) {
            this.table = table;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int col = table.getSelectedColumn();
            int row = table.getSelectedRow();

            int colCount = table.getColumnCount();
            int rowCount = table.getRowCount();

            col++;
            if (col >= colCount) {
                col = 0;
                row++;
            }

            if (row >= rowCount) {
                row = 0;
            }

            table.getSelectionModel().setSelectionInterval(row, row);
            table.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
        }

    }

}

Tab 的功能是通过我记得的焦点管理器更改默认焦点行为来控制的

【讨论】:

  • 我正在使用netbeans,所以我应该如何初始化JTable table = new JTable(); InputMap im = table.getInputMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),"Action.NextCel"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,0),"Action.NextCell"); ActionMap am = table.getActionMap(); am.put("Action.NextCell", new NextCellActioin(table));
  • 我用NetBeans写了例子,你的意思是你用的是表单编辑器?
  • 在您的示例中public Test101() {} 这是初始化部分,我无法正常编辑它我必须在设计中使用自定义代码!!
  • 好的,所以您将在代码中的某处引用JTable(例如,默认为jtable1)。在类构造函数中调用initComponents 方法后,您应该应用键绑定,使用您的JTable 的引用代替我的table
  • 当我以正常方式使用 Tab 键时的另一件事!我正在跳过最后一列并插入新行!一切正常,但新行没有自动选择它! setRowSelectionInteral() 正在抛出空点异常!!
【解决方案2】:
    KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
    KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
    InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    im.put(enter, im.get(tab));

【讨论】:

  • im.get(tab) 返回null。我记得,JTable 通过focus sub system 修改了默认的焦点横向行为
  • @MadProgrammer,JTable 使用自定义操作在表格单元格之间进行制表符。查看我的Key Bindings 程序,其中列出了所有默认绑定。关键是使用“祖先”InputMap来获取选项卡KeyStroke的标识符。
  • @camickr 谢谢,这有点吓到我了
【解决方案3】:

你可以在JTable的action map和input map上指定行为:

InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Object actionKey = new Object();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), actionKey);
table.getActionMap().put(actionKey, new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent event) {
        // Do something for ENTER
    }
});

你所说的默认行为存在于动作映射中,默认初始化。

【讨论】:

  • 我记得,JTable 通过focus sub system 修改了默认的焦点横向行为,TAB 不是通过键绑定控制的
  • 我在这里不使用 Tab 键。问题是关于 ENTER 键的,这就是我在这里使用的。
  • 我假设您对默认行为的引用是针对 tab 键的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多