做一个SWING程序,界面上用到了JTable,现在客户要求去掉CTRL+A功能,在允许多记录选择的情况下,这个热键组合功能为选中全部记录,虽然我设置只允许选择一行(不允许多行同时选择),但CTRL+A功能变成自动跳转到最后一条记录上去了,郁闷。
我的表不需要输入功能的,但用户要选择记录、通过上、下箭头移动记录的,用户不喜欢CTRL+A功能。:(

解决方案 »

  1.   

    去掉 Ctrl + A 全选
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;public class Table {
        public static void main(final String[] args) {
            java.awt.EventQueue.invokeLater(new Runnable(){
                    public void run(){
                        DefaultTableModel model = new DefaultTableModel(5,10){
                                public Object getValueAt(int r,int c){
                                    return Integer.valueOf(r*c);
                                }
                                public boolean isCellEditable(int r,int c){
                                    return false;
                                }
                            };
                        JTable table = new JTable(model);
                        final InputMap im = new ComponentInputMap(table);
                        final ActionMap am = new ActionMap();
                        im.put(KeyStroke.getKeyStroke("ctrl a"),"donothing");
                        am.put("donothing",null);
                        table.setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW,im);
                        table.setActionMap(am);
                        JFrame frame = new JFrame("Table");
                        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        frame.getContentPane().add(new JScrollPane(table));
                        frame.pack();
                        frame.setLocationRelativeTo(null);
                        frame.setVisible(true);
                    }
                });
        }
    }
      

  2.   

    感谢楼上提供了很好的思路,不过按你的方法,通过上、下箭头移动记录的功能也没了,不知道有没有办法把原来的CTRL+A的动作直接替换为不做任何事情.
      

  3.   

    在 ComponentInputMap ActionMap 里添加 处理 UP 和 DOWN。
      

  4.   

    http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html这是的文章介绍怎么阻止某个热键,不知道为什么我设置了不起作用,我并不想重起炉灶重新实现TABLE自带的全部热键功能,只是想去除某个功能而已。:(
    Table1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ctrl a"), "doNothing");
    Table1.getActionMap().put("doNothing", new AbstractAction() {
                @Override public void actionPerformed(ActionEvent e) {
                }
            });
      

  5.   

    报告大家,上面的代码是可以起作用的,之前可能是我代码没有编译完整所以看不到结果误以为不起作用。再次感谢huntor的思路,偶是JAVA初学者,所以有些问题不知道从哪些方向着手,见谅。
      

  6.   

    Table1.getInputMap().put(KeyStroke.getKeyStroke("ctrl a"), "doNothing");
    Table1.getActionMap().put("doNothing", new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
      }
      });这样的使用才能起作用,前面给错getInputMap()的参数了,应该不用参数(相当于用WHEN_FOCUSED参数),也可以在actionPerformed方法里实现自己特定的功能。:)