在jTable上像Tab键一样使用Enter键



我在我的项目中卡住了2天,我无法实现如何使ENTER键TAB键一样,我尝试了键监听器,但ENTER键有JTable的默认功能,所以它不工作,它继续向下移动。我谷歌它发现我需要使用键绑定,但我无法实现它。

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

Thanks in advance

基本的改变是使用键绑定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的功能是通过焦点管理器更改默认焦点行为来控制的,我记得

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

您可以在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
    }
});

您所谈论的默认行为存在于动作图中,默认初始化。

相关内容

最新更新