我有一个单元格编辑器,其中包含一个小按钮,可以双击该按钮来弹出编辑对话框,然后是一个可用于内联编辑值的文本字段(需要弹出窗口才能编辑其他值,仅允许编辑第一个显示在 JTable 中)。
当用户单击字段时,一切正常,但如果他们使用 Tab 键进入该字段,则文本字段不会获得焦点,并且除非用鼠标单击该字段,否则他们无法编辑该字段。
我尝试摆弄 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);
}
}
尝试将焦点监听器添加到面板,似乎没有任何区别
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");
}
}
因此,在按 Tab 键进入字段后,我键入一个键,看起来好像获得了焦点,但您无法在该字段中输入任何内容,而如果我键入 RETURN,那么我可以开始编辑该字段,按 RETURN 做什么才能使其工作?
按 RETURN 键有何作用使其能够工作?
如手上所示按键绑定 http://tips4java.wordpress.com/2008/10/10/key-bindings/应用程序,默认ENTER
大多数 L&F 中的键绑定是notify-field-accept
。目前尚不清楚为什么你的ActionListener
begins with stopCellEditing()
。我本来希望它会调用fireEditingStopped()
after更新数据模型,如本中所建议的example http://sites.google.com/site/drjohnbmatthews/table.
可惜我不熟悉Jaikoz http://www.jthink.net/jaikoz/。你可能会看看概念:编辑器和渲染器 http://download.oracle.com/javase/tutorial/uiswing/components/table.html#editrender以及后续部分的额外指导。
附录:正如您在评论中指出的,JTextField
in a DefaultCellEditor
默认情况下允许在选定字段中输入内容。从您的示例中尚不清楚该默认值如何被取消。缺席sscce http://sscce.org这说明了问题,您可以将您的代码与此相关的代码进行比较example https://stackoverflow.com/questions/2511415使用子类展示默认行为JTextField
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)