2010-10-22 56 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 2010-10-22 14:04:36

回答

2

所以,我已经找到了解决,这要归功于这篇文章http://jroller.com/santhosh/entry/keyboard_handling_in_tablecelleditor,和阿布这一些有益的探讨,以及它如何在http://forums.java.net/jive/thread.jspa?messageID=482236&#482236

可以应用到其它部件不完全了解,这整个地区显得较为雷区

我还添加了这种解决方案Get correct editing behaviour in JTable using java DefaultCellEditor这个解决方案所以当y ou使用键盘开始编辑字段,现有值将被替换,但当您双击该字段时不会。

我的一个疑惑是,我没有收到关键事件,因为我期望,但只是为空,所以我不得不解释。

伊夫使用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导入在堆栈溢出中格式不正确? – 2010-10-22 14:12:03

+0

请重新格式化您的代码。你不需要html标签;只是缩进四个空格,如问题所示。还有一个代码格式按钮。 – trashgod 2010-10-22 14:13:39

+0

是的,我以前使用过,它不适用于我,只是重试,仍然是错的 – 2010-10-22 14:16:12

0

例如添加

rowCount.setFocusable(假);

在SimpleMultiRowCellEditor构造

,防止按钮获取焦点,使JTextField是唯一怎么能有专注于电池版

+0

那不适合我 – 2010-10-22 13:59:14

相关问题