Java 在jTable上使用Enter键,就像使用Tab键一样

Java 在jTable上使用Enter键,就像使用Tab键一样,java,swing,tabs,jtable,enter,Java,Swing,Tabs,Jtable,Enter,我在项目中被困了两天,我无法实现如何使回车键像制表键一样我尝试了键侦听器,但是回车键有一个JTable的默认功能,所以它不起作用,它一直向下移动。我发现我需要使用键绑定,但我无法实现它 有人能在JTable上给我一个完整的编码示例吗???请你帮忙 提前感谢您可以在JTable的操作映射和输入映射中指定行为: InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); Object actionKe

我在项目中被困了两天,我无法实现如何使回车键制表键一样我尝试了键侦听器,但是回车键有一个JTable的默认功能,所以它不起作用,它一直向下移动。我发现我需要使用键绑定,但我无法实现它

有人能在JTable上给我一个完整的编码示例吗???请你帮忙


提前感谢

您可以在
JTable
的操作映射和输入映射中指定行为:

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的操作映射和输入映射中指定该行为:

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
    }
});
    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));

您谈论的默认行为出现在操作映射中,默认情况下已初始化。

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

    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));
此示例基本上将相同的命名操作应用于Enter键和Tab键,这使得通过使用单个
操作
可以轻松修改它们的行为

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的功能是通过focus manager更改默认的焦点行为来控制的,正如我所记得的

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

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

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);
        }

    }

}


选项卡的功能是通过焦点管理器更改默认焦点行为来控制的,正如我回忆的那样

im.get(Tab)
返回
null
。我记得,
JTable
通过@MadProgrammer修改默认的焦点横向行为,JTable使用自定义操作在表单元格之间进行制表。查看列出所有默认绑定的“我的程序”。关键是使用“祖先”输入映射来获取制表键击键的标识符。@camickr谢谢,这让我有点吃惊
im.get(tab)
返回
null
。我记得,
JTable
通过@MadProgrammer修改默认的焦点横向行为,JTable使用自定义操作在表单元格之间进行制表。查看列出所有默认绑定的“我的程序”。关键是使用“祖先”输入映射来获取制表键击键的标识符。@camickr谢谢,这让我有点吃惊,我记得,
JTable
通过修改默认的焦点横向行为,制表符不是通过键绑定控制的。我在这里不使用制表键。问题是关于ENTER键的,这就是我在这里使用的。我假设您对默认行为的引用是针对tab键的。我记得,
JTable
通过修改默认焦点横向行为,tab不通过键绑定控制。我在这里不使用tab键。问题是关于ENTER键,这就是我在这里使用的。我假设您对默认行为的引用是针对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_选项卡,0),“Action.NextCell”);ActionMap am=table.getActionMap();am.put(“Action.NextCell”,新的NextCellaction(表))我在NetBeans中编写了这个示例,你是说你使用表单编辑器吗?在你的示例中,
public Test101(){}
是初始化部分,我不能正常编辑它,我必须在设计中使用自定义代码!!好的,那么您将在代码中的某个地方有一个
JTable
的引用(例如,它默认为
jtable1
)。在类构造函数中调用
initComponents
方法后,您应该应用键绑定,使用
JTable
的引用代替我的
,这是我正常使用tab键时的另一件事!!我跳过了最后一列,插入了一个新行!!一切正常,但新行不是自动选择的
setRowSelectionTerral()
正在引发空点异常!!我正在使用netbeans,所以我应该如何初始化
JTable table=newjtable();InputMap im=table.getInputMap();im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),“Action.NextCel”);im.put(KeyStroke.getKeyStroke(KeyEvent.VK_选项卡,0),“Action.NextCell”);ActionMap am=table.getActionMap();am.put(“Action.NextCell”,新的NextCellaction(表))我在NetBeans中编写了这个示例,你是说你使用表单编辑器吗?在你的示例中,
public Test101(){}
是初始化部分,我不能正常编辑它,我必须在设计中使用自定义代码!!好的,那么您将在代码中的某个地方有一个
JTable
的引用(例如,它默认为
jtable1
)。在类构造函数中调用
initComponents
方法后,您应该应用键绑定,使用
JTable
的引用代替我的
,这是我正常使用tab键时的另一件事!!我跳过了最后一列,插入了一个新行!!一切正常,但新行不是自动选择的
setRowSelectionTerral()
正在引发空点异常!!尽管这是可能的,但我不会为下一个单元格锁定ENTER键,您必须(复杂化)覆盖TableCellEditor的stopCellEditing,不要混淆用户,让它用于鲸鱼和使用标准,相同的命令在MsExcel中等。