2010-10-21 39 views
3

我有一个包含一个小按钮,可以进行双点击,弹出的编辑对话框,然后可以使用文本框编辑值内联(一个单元格编辑器该弹出窗口是允许编辑附加值的,只有第一个显示在JTable中)。问题越来越注重使用时的JPanel作为JTable中单元格编辑器

当用户点击场一切正常,但如果他们卡口,他们文本框不接收焦点,他们不能编辑,除非他们一下就可以用鼠标领域的领域。

我试图与JPanel的不同的焦点方法摆弄,但它并没有区别,任何人知道我在做什么错?

package com.jthink.jaikoz.celleditor; 

import com.jthink.jaikoz.celldata.Cell; 
import com.jthink.jaikoz.guielement.Focus; 
import com.jthink.jaikoz.table.CellLocation; 
import com.jthink.jaikoz.table.DatasheetToggleButton; 
import com.jthink.jaikoz.table.datasheet.Datasheet; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

public class SimpleMultiRowCellEditor 
    extends DefaultCellEditor implements ActionListener 
{ 

    final JPanel panel; 
    private final DatasheetToggleButton rowCount; 
    Cell value; 

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

     rowCount = new DatasheetToggleButton(); 
     rowCount.setVisible(true); 
     rowCount.addActionListener(this); 
     panel = new JPanel(); 
     panel.setOpaque(false); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); 
     panel.add(rowCount); 
     panel.add(editorComponent); 
     /*panel.setFocusable(true); 
     panel.setFocusCycleRoot(true); 
     ArrayList focusOrder = new ArrayList(); 
     focusOrder.add(editorComponent); 
     focusOrder.add(rowCount); 
     focusOrder.add(panel); 
     panel.setFocusTraversalPolicy(new Focus(focusOrder)); 
     */ 
    } 

    public Component getTableCellEditorComponent(
     final JTable table, final Object val, final boolean isSelected, 
     final int row, final int column) 
    { 
     value = (Cell) ((Cell) val).clone(); 
     rowCount.setText(String.valueOf(value.getValues().size())); 
     delegate.setValue(value.getValue()); 
     return panel; 
    } 

    public Object getCellEditorValue() 
    { 
     final String s = (String) delegate.getCellEditorValue(); 
     value.setValue(s); 
     return value; 
    } 

    public void actionPerformed(final ActionEvent e) 
    { 
     this.stopCellEditing(); 
     final CellLocation cl = Datasheet.getActiveEditSheet() 
      .getTable().getSelectedCellLocations().get(0); 
     UpdateMultiRowCellDialog.getInstanceOf().display(value,cl); 
    } 
} 

尝试添加的FocusListener于面板,没有似乎什么差别

class PanelFocusListener implements FocusListener 
{ 
    public void focusGained(FocusEvent e) 
    { 
     System.out.println("Gained Focus"); 
     editorComponent.requestFocusInWindow(); 
    } 

    public void focusLost(FocusEvent e) 
    { 
     System.out.println("Lost Focus"); 

    } 
} 

所以跳格到现场后,我输入一个密钥,并将其排序的样子喜欢在获得焦点,但你不能输入任何东西进入现场,而如果我输入RETURN,那么我可以开始编辑该字段,按下RETURN可以使其工作吗?

+0

重新格式化的代码;如果不正确请回复。 – trashgod 2010-10-21 13:31:38

回答

1

什么按下回车这样做,允许它的工作?

如在手持Key Bindings申请中所示,默认ENTER键在至多L & Fs的结合是notify-field-accept。目前尚不清楚为什么你的ActionListener开始stopCellEditing()。我本来期望它之后调用fireEditingStopped()更新的数据模型,在此example建议。

可悲的是,我不熟悉Jaikoz。您可以查看Concepts: Editors and Renderers和后续部分以获取更多指导。

附录:如您的评论中所述,JTextFieldDefaultCellEditor允许在默认情况下在所选字段中输入。从您的示例中不清楚该默认值是如何被取消的。如果没有显示问题的sscce,则可以将您的代码与此相关的example进行比较,该代码显示使用JTextField的子类的默认行为。

+0

忽略双击按钮时使用的ActionListener,但与此问题无关。我想关于RETURN我想知道如何按下任意键使文本框准备好像返回键一样进行编辑,这是任何键在标准JTextfield单元格编辑器中的作用。不需要与jaikoz的相似性;) – 2010-10-21 18:50:48

+0

仅供参考,我已经在上面添加了一个相关示例的链接。 – trashgod 2010-10-22 04:22:04

+0

好吧,在创建一个sscce我做了一些进步,使用table.setSurrendersFocusOnKeystroke(true)有帮助,并且我意识到我的代码已经将RETURN键映射到不同于默认字符的东西,但是我现在遇到另一个问题,因为它的不同的艾韦创建了一个新的问题http://stackoverflow.com/questions/3995619/losing-first-character-in-jtable-panel-based-cell-editor – 2010-10-22 09:46:52