菜鸟求助:
 
  我想通过delete键删除JTable中选中的行,用了KeyEvent.getKeyCode() == KeyEvent.VK_DELETE,
  
  按下delete键无法删除,发出“丁”的提示音,这是怎么回事?

解决方案 »

  1.   


    额,感觉不是代码的问题,我把键盘响应代码删掉依然是这样。不过我发现按下DELETE键后会使单元格进入可编辑状态,就像按下backspace键会删除单元格内的最后一个字符,而DELETE键是删除光标后面的字符,而默认光标是在最后面的,所以没有可以删除的字符,所以会提示“丁”的声音不知道是不是这样。唉,这是书上的一道习题,我竟不会做啊。求高手
      

  2.   


    额,绑定到JTable和JFrame都试过了
      

  3.   


    public class TableModelDemo extends JFrame implements ActionListener
    {
       //data field
       private JLabel jlblSelectionMode = new JLabel("SelectionMode",JLabel.RIGHT);
       private JComboBox jcboSelectionMode;
       private JCheckBox jchkRowSelectionAllowed = new JCheckBox("RowSelectionAllowed",true);
       private JCheckBox jchkColumnSelectionAllowed = new JCheckBox("ColumnSelectionAllowed",false);
       private JTable jtable;
       private JButton jbtSave,jbtClear,jbtRestore,jbtAddRow,jbtAddColumn,jbtDelRow,jbtDelColumn;
       private JPanel jpanelNorth,jpanel1,jpanel2,jpanelCenter,jpanelSouth;
       private DefaultTableModel model;
       
       //method field
       TableModelDemo()
       {
          //开辟空间
          jcboSelectionMode = new JComboBox(new String[] {"SINGLE_SLECTION","SINGEL_INTERVAL_SELECTION","MULTIPLE_INTERVAL_SELECTION"});
          jbtSave = new JButton("保存");
          jbtClear = new JButton("清空");
          jbtRestore = new JButton("恢复");
          jbtAddRow = new JButton("添加新行");
          jbtAddColumn = new JButton("添加新列");
          jbtDelRow = new JButton("删除选中行");
          jbtDelColumn =new JButton("删除选中列");
          jpanelNorth = new JPanel();
          jpanel1 = new JPanel(new GridLayout(1,2,5,5));
          jpanelCenter = new JPanel(new BorderLayout());
          jpanel2 = new JPanel();
          jpanelSouth = new JPanel(new GridLayout(2,2,5,5));
          Object[][] data = new Object[][] {
           {"USA" , "Washington DC" ,280,true},
           {"Canada" , "Ottawa" ,60,true},
           {"United Kingdom" , "London" ,60,true},
           {"Germany" , "Berlin" , 83, true},
           {"France" , "Paris" , 60 , true},
           {"Norway" , "Oslo" , 4.5 , true},
           {"India" , "New Deli" , 1046 , true}
         };
       String[] names = new String[]{"Country","Capital","Population in Millons","Democracy"};
       model = new DefaultTableModel(data,names);
       jtable = new JTable(model);
       jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
       //注册监听
       jbtSave.addActionListener(this);
       jbtClear.addActionListener(this);
       jbtRestore.addActionListener(this);
       jbtAddRow.addActionListener(this);
       jbtAddColumn.addActionListener(this);
       jbtDelRow.addActionListener(this);
       jbtDelColumn.addActionListener(this);
       jchkRowSelectionAllowed.addActionListener(this);
       jchkColumnSelectionAllowed.addActionListener(this);
       jcboSelectionMode.addActionListener(this);
                     jtable.addKeyListener( new KeyAdapter()
                        {
                             public void keyPressed(KeyEvent event)
                             {
                                if(event.getKeyCode() == KeyEvent.VK_DELETE)
                                {
                                    int[] selectedRowIndices = jtable.getSelectedRows();
                          for(int i = 0; i < selectedRowIndices.length; i++)
                          model.removeRow(i);
                                }
                             }
                         });
           
       //排布组件
       jpanelNorth.add(jlblSelectionMode);
       jpanelNorth.add(jcboSelectionMode);
       jpanel1.add(jchkRowSelectionAllowed);
       jpanel1.add(jchkColumnSelectionAllowed);
       jpanel2.add(jbtSave);
       jpanel2.add(jbtClear);
       jpanel2.add(jbtRestore);
       jpanelCenter.add(jpanel1,BorderLayout.NORTH);
       jpanelCenter.add(new JScrollPane(jtable),BorderLayout.CENTER);
       jpanelCenter.add(jpanel2,BorderLayout.SOUTH);
       jpanelSouth.add(jbtAddRow);
       jpanelSouth.add(jbtAddColumn);
       jpanelSouth.add(jbtDelRow);
       jpanelSouth.add(jbtDelColumn);
       add(jpanelNorth,BorderLayout.NORTH);
       add(jpanelCenter,BorderLayout.CENTER);
       add(jpanelSouth,BorderLayout.SOUTH);
       }
       
       public void actionPerformed(ActionEvent event)
       {
         Object source = event.getSource();
         
         if(source == jcboSelectionMode)
         {
           if(jcboSelectionMode.getSelectedItem().equals("SINGLE_SELECTION"))
              jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
           else if(jcboSelectionMode.getSelectedItem().equals("SINGLE_INTERVAL_SELECTION"))
              jtable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
           else
              jtable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         }
         
         if(source == jchkRowSelectionAllowed)
            jtable.setRowSelectionAllowed(jchkRowSelectionAllowed.isSelected());
         
         if(source == jchkColumnSelectionAllowed)
            jtable.setColumnSelectionAllowed(jchkColumnSelectionAllowed.isSelected());
         
         if(source == jbtSave)
         {
           try
           {
             ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("tablemodel.dat"));
             out.writeObject( model.getDataVector());
             out.writeObject(getColumnNames());
             out.close();
           }
           catch(Exception ex)
           { 
             ex.printStackTrace();
           }
         }
         
         if(source == jbtClear)
           model.setRowCount(0);
         
         if(source == jbtRestore)
         {
           try
           {
             ObjectInputStream in = new ObjectInputStream(new FileInputStream("tablemodel.dat"));
             model.setDataVector( ((java.util.Vector)in.readObject()),((java.util.Vector)in.readObject()) );
             in.close();
           }
           catch(Exception ex)
           {
              ex.printStackTrace();
           }
         } 
         
         if(source == jbtAddRow)
            model.addRow(new java.util.Vector());
         
         if(source == jbtAddColumn)
         {
            String head = JOptionPane.showInputDialog(this,"输入列名","输入",JOptionPane.QUESTION_MESSAGE);
            model.addColumn(head);
         }
     
         if(source == jbtDelRow)
         {
            if(jtable.getSelectedRowCount() > 0)
            {
              int[] selectedRowIndices = jtable.getSelectedRows();
              for(int i = 0; i < selectedRowIndices.length; i++)
                model.removeRow(i);
            }
         }
         
         if(source == jbtDelColumn)
         {
            TableColumnModel columnModel = (TableColumnModel)jtable.getColumnModel();
            if(jtable.getSelectedColumnCount() > 0)
            {
              int[] selectedColumnIndices = jtable.getSelectedColumns();
              for(int i = 0; i < selectedColumnIndices.length; i++)
                columnModel.removeColumn(columnModel.getColumn(i));
            }
         }
       }
       
       private Vector getColumnNames()
       {
          Vector<String> names = new Vector<String>();
          for(int i = 0; i < model.getColumnCount(); i++)
           names.add(jtable.getColumnName(i));
          return names;
       }
       
       public static void main(String[] args)
       {
          TableModelDemo frame = new TableModelDemo();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setSize(400,300);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
       }
    }