[英]Problem getting focus when use JPanel as JTable cell editor
我有一个单元格编辑器,其中包含一个可以双击以显示编辑对话框的小按钮,然后是一个可用于编辑内联值的文本字段(需要弹出窗口才能编辑其他值,只有首先显示在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做什么允许它工作?
什么按RETURN可以让它工作?
如方便的Key Bindings应用程序所示,大多数L&F中的默认ENTER
键绑定是notify-field-accept
。 目前尚不清楚为什么你的ActionListener
以stopCellEditing()
开头 。 我希望它在更新数据模型后调用fireEditingStopped()
,如本例所示 。
可悲的是,我对Jaikoz不熟悉。 您可以查看概念:编辑器和渲染器以及后续部分以获取其他指导。
附录:如您的评论中所述, DefaultCellEditor
的JTextField
允许在默认情况下键入所选字段。 从您的示例中不清楚该默认值是如何无效的。 如果没有演示此问题的sscce ,您可以将代码与使用JTextField
的子类展示默认行为的相关示例进行比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.