2010-10-22 2 views
2

У меня есть редактор ячейки, которая содержит маленькую кнопку и затем текстовое поле, которое может использоваться для редактирования значения инлайнПотеря первого символа в редакторе JTable панели на основе клеток

Я использую setSurrendersFocusOnKeystroke (истина) и фокус слушатель чтобы пользователь мог сразу начать редактирование с клавиатуры, но проблема заключается в том, что нажатая клавиша fisrt кажется потребляемой, а добавляется в текстовое поле, как я могу это предотвратить?

Полное автономный пример ниже

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 

public class PanelTableEditorTest extends JFrame { 

    private JTable table; 

    public PanelTableEditorTest() { 
     this.setLayout(new BorderLayout()); 
     table = new JTable(10, 10); 
     table.getSelectionModel().setSelectionMode(
      ListSelectionModel.SINGLE_SELECTION); 
     table.setCellSelectionEnabled(true); 
     table.setDefaultEditor(Object.class, new SimpleMultiRowCellEditor()); 
     table.setSurrendersFocusOnKeystroke(true); 
     table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) 
      .put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F2, 0), 
      "none"); 
     table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) 
      .put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ENTER, 0), 
      "startEditing"); 
     this.add(table.getTableHeader(), BorderLayout.NORTH); 
     this.add(table, BorderLayout.CENTER); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new PanelTableEditorTest(); 
      } 
     }); 
    } 

    public class SimpleMultiRowCellEditor extends DefaultCellEditor { 

     final JPanel panel; 
     private final JButton rowCount; 

     public SimpleMultiRowCellEditor() { 
      super(new JTextField()); 
      this.setClickCountToStart(1); 

      rowCount = new JButton(); 
      rowCount.setVisible(true); 
      panel = new JPanel(); 
      panel.setOpaque(false); 
      panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
      panel.add(rowCount); 
      panel.add(editorComponent); 
      panel.addFocusListener(new PanelFocusListener()); 
     } 

     public Component getTableCellEditorComponent(
      final JTable table,final Object val, final boolean isSelected, 
      final int row, final int column) { 
      rowCount.setText("1"); 
      delegate.setValue(val); 
      editorComponent.requestFocusInWindow(); 
      return panel; 
     } 

     class PanelFocusListener implements FocusListener { 

      public void focusGained(FocusEvent e) { 
       editorComponent.requestFocusInWindow(); 
      } 

      public void focusLost(FocusEvent e) { 
      } 
     } 
    } 
} 
+0

переформатирован код; пожалуйста, верните, если это неверно. – trashgod

ответ

2

Так что я нашел решение, благодаря этой статье http://jroller.com/santhosh/entry/keyboard_handling_in_tablecelleditor и некоторые полезные обсуждения Abou это и как он может быть применен и к другим компонентам на http://forums.java.net/jive/thread.jspa?messageID=482236&#482236

не полностью понять решение вся эта область представляется весьма минное поле

Я также добавил это решение Get correct editing behaviour in JTable using java DefaultCellEditor в этом так что когда y ou начните редактирование поля, используя клавиатуру, существующее значение будет заменено, но не при двойном щелчке по полю.

Мое единственное замешательство в том, что я не получаю ключевое событие, как я ожидал, но просто нулевой, поэтому мне пришлось учитывать это.

Ive вернулся с помощью setSurrenderKeystrokes (истина), потому что это вызывает проблемы с другими редакторами, такие как простой textfieldeditor

import javax.swing.*; 
import javax.swing.text.Caret; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.util.EventObject; 

public class PanelTableEditorTest extends JFrame 
{ 

    private JTable table; 

    public PanelTableEditorTest() 
    { 
     try 
     { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch(Exception e) 
     { 

     } 
     this.setLayout(new BorderLayout()); 
     table = new JTable(4, 4); 
     table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.setCellSelectionEnabled(true); 
     table.setSurrendersFocusOnKeystroke(false); 
     table.setDefaultEditor(Object.class,new SimpleMultiRowCellEditor()); 
     table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(java.awt.event. 
         KeyEvent.VK_F2, 0), "none"); 
     table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(java.awt.event. 
         KeyEvent.VK_ENTER, 0), "startEditing"); 

     this.add(table.getTableHeader(), BorderLayout.NORTH); 

     this.add(table, BorderLayout.CENTER); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new PanelTableEditorTest(); 

      } 
     }); 
    } 

    public class SimpleMultiRowCellEditor extends DefaultCellEditor 
    { 
     private EventObject event; 
     final JPanel panel; 
     private final JButton rowCount; 

     public SimpleMultiRowCellEditor() 
     { 
      super(new JTextField()); 
      this.setClickCountToStart(1); 

      rowCount = new JButton(); 
      rowCount.setVisible(true); 
      panel = new TableEditorPanel(); 
      panel.setRequestFocusEnabled(true); 
      panel.setOpaque(false); 
      panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
      panel.add(rowCount); 
      panel.add(editorComponent); 
     } 

     public boolean isCellEditable(EventObject anEvent) 
     { 
      event=anEvent; 
      return super.isCellEditable(anEvent); 
     } 

     public Component getTableCellEditorComponent(final JTable table, final Object val, final boolean isSelected, final int row, final int column) 
     { 
      rowCount.setText("1"); 
      delegate.setValue(val); 
      if(event instanceof KeyEvent || event==null) 
      { 
       final Caret caret = ((JTextField)editorComponent).getCaret(); 
       caret.setDot(0); 
       ((JTextField)editorComponent).setText("");     
      } 
      return panel; 
     } 

     class TableEditorPanel extends JPanel 
     { 

      public void addNotify(){ 
       super.addNotify(); 
       editorComponent.requestFocus(); 
      } 

      protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed){ 
       InputMap map = editorComponent.getInputMap(condition); 
       ActionMap am = editorComponent.getActionMap(); 

       if(map!=null && am!=null && isEnabled()){ 
        Object binding = map.get(ks); 
        Action action = (binding==null) ? null : am.get(binding); 
        if(action!=null){ 
         return SwingUtilities.notifyAction(action, ks, e, editorComponent, 
           e.getModifiers()); 
        } 
       } 
       return false; 
      } 
     } 
    } 
} 
+0

Почему мой импорт java неверно форматируется в переполнении стека? –

+0

Пожалуйста, переформатируйте свой код. Вам не нужны html-теги; просто отступ четыре пробела, как показано в вопросе. Также есть кнопка формата кода. – trashgod

+0

Да, я использовал это ранее и не работал для меня, просто повторил и все еще неправильно –

0

добавить

rowCount.setFocusable (ложный);

в конструкторе SimpleMultiRowCellEditor, чтобы предотвратить кнопку, чтобы получить фокус, так что JTextField является только то, как может иметь фокус на мобильном издании

+0

Это не работает для меня –