2013-11-07 2 views
0

У меня возникла проблема с тем, что мой класс расширения не может поймать KeyEvent. Вот код:JTable, завернутый внутри JScrollPane внутри JPanel, не может поймать KeyEvent

public class DatabaseJTable extends JTable implements KeyListener { 
    public DatabaseJTable(Object [][] data, Object [] columnNames) { 
     super(data, columnNames); 
    } 

    @Override 
    public boolean isCellEditable(int row, int column) { 
     return false; 
    } 

    @Override 
    public void keyPressed(KeyEvent kv) { 
     // TODO Auto-generated method stub 
     if (kv.getKeyChar() == KeyEvent.VK_F2) { 
      int selectedRow = this.getSelectedRow(); 
      System.out.println(this.getModel().getValueAt(selectedRow, 1)); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

А вот как используется класс:

public class DatabaseRecordScreen extends JPanel { 
    public DatabaseRecordScreen() { 
     String [] columnNames = {"Date", "Order Number", "Item Number", "Contact", "Client", "Quantity"}; 
     Object [][] data = getAllWorkOrders(); 
     DatabaseJTable dataTable = new DatabaseJTable(data, columnNames); 
     dataTable.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     dataTable.setFillsViewportHeight(true); 

     JScrollPane scrollPane = new JScrollPane(dataTable);  
     scrollPane.setPreferredSize(Furniture.MAX_PANEL_SIZE); 
     this.setPreferredSize(Furniture.MAX_PANEL_SIZE); 
     this.add(scrollPane); 
    } 
} 

DatabaseJTable не может поймать ни KeyEvent. Я отлаживал и устанавливал точку останова в начале метода KeyPressed. Но его никогда не поймают.

Если я пропустил что-нибудь, не могли бы вы рассказать мне и сообщить мне, как решить эту проблему. Благодарю.

+0

Я думаю, что вы могли бы найти F2 уже привязаны к функции редактирования начала – MadProgrammer

+0

я изменил его VK_E но ничего не произошло – lightbringer

ответ

1

KeyListener s известны своей изменчивостью. Чтобы работать, компонент, на который они зарегистрированы, должен быть не только фокусируемым, но и должен быть направлен на работу.

Лучшим решением было бы использовать, например, key bindings API.

enter image description here

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.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
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 TableKeyBindings { 

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

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

       DefaultTableModel model = new DefaultTableModel(new String[]{"Row", "Name"}, 0); 
       String[] names = new String[]{ 
        "Lyveb", "Eldw", "Sutaw", "Radine", "Namhin", "Draos", "Et'rad", 
        "Deloef'c", "Ashlyeu", "Urner", "Nalund", "Rothem", "En'saya", "Torelm", 
        "Sulyc-it", "Ranray", "Denehin", "Zhayss", "Untechustos", "Aldh", "Tastintin", 
        "Burl", "Lyeril", "Trohliss", "Lehub", "Feyef", "Tutsul", "Ingjsam", 
        "When", "Worunde", "Ashtai", "Undoc", "Nyril", "Ightigar", "Umach", 
        "Ceracki", "Ler'elda", "Ray'vesa", "Echril", "Chrorodang", "Oskim", "Mos'tas", 
        "Siusk", "Yertas", "Queler", "Parehy", "Essr", "Shyhon", "Inep", 
        "Yeraer", "Inand", "Osutur", "Aryny", "Vycel", "Roolt", "Ceriss-kin", 
        "Age'augha", "Lelysa", "Ahaty", "Engpolskel", "Kulal", "Ardlper", "Lonuru", 
        "Belyf", "Chroozis", "Rodir", "Dralech", "Undvorrod", "Aqueo", "Yshya", 
        "Eldrad", "Umbur", "Ina'pola", "Hon'er", "Rientai", "Wareph", "Urnil'l", 
        "Et'inee", "Kyest", "Rodinga", "Yenet", "Fothund", "Ackgcer", "Estbanos", 
        "Seroughrad", "Nyer", "Tortiatia", "Dosac", "Moimash", "Whiril", "Oundi", 
        "Sayangrak", "Taqh", "Fidad", "Elmom", "Sayvera", "Imsayo", "Elmsam", 
        "Hubame", "Phorileng", "Bel'ves", "Awit", "Kelvesonhin", "Ingpol", "Ough'ther", 
        "Inaine", "Rilck", "Shys", "Ightl", "Vesangar", "Queineo", "Jyunt", 
        "Aleack", "Ageat", "Cysod", "Deluju", "Oldl", "Alent", "Tia'dele"}; 

       int row = 0; 
       for (String name : names) { 
        model.addRow(new String[]{Integer.toString(++row), name}); 
       } 

       JTable table = new JTable(model); 
       InputMap inputMap = table.getInputMap(JComponent.WHEN_FOCUSED); 
       ActionMap actionMap = table.getActionMap(); 

       inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), "Show"); 
       actionMap.put("Show", new AbstractAction() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         JTable table = (JTable)e.getSource(); 
         int row = table.getSelectedRow(); 
         if (row != -1) { 

          row = table.convertRowIndexToModel(row); 
          String name = (String) table.getModel().getValueAt(row, 1); 

          JOptionPane.showMessageDialog(null, name, "Show", JOptionPane.INFORMATION_MESSAGE); 

         } 
        } 
       }); 

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

} 

Теперь одна из других причин у вас возникли проблемы, является тот факт, что kv.getKeyChar() == KeyEvent.VK_F2 не сопоставимы, то есть, ключ char не будет соответствовать значению VK, только отношения у них есть имя.

Я думаю, что вы могли бы иметь больше как с kv.getKeyCode(), но вы будете иметь больший успех, с клавиатурными комбинациями ...

+0

большое спасибо. Раньше я не знал об API привязки ключей. Он решает мою проблему. – lightbringer

+0

Возможно, вам придется играть с объемом 'InputMap', но пока этого недостаточно ... – MadProgrammer

Смежные вопросы