在微调器外部单击时,在JSpinner上丢失焦点和提交编辑

时间:2014-07-31 21:09:36

标签: java swing jtable focus jspinner

我有一个JTable,其单元格编辑器是JSpinners。我正在使用自定义单元格编辑器类来完成此任务。我的JPanel中还有一些其他组件。当用户正在编辑其中一个单元格(即JSpinner具有焦点)时,我的问题就出现了,然后在没有先按下输入或失去焦点的情况下与其他组件之一进行交互。我希望JSpinner在运行与其他组件关联的代码之前立即失去焦点并提交更改,而JSpinner只是保留其焦点。

理想情况下,我希望只要用户点击JSpinner本身内部的任何地方,JSpinner就会立即失去焦点。这是我的自定义编辑器类:

public class PhyMappingTableCellEditor extends AbstractCellEditor implements TableCellEditor {
    final JSpinner spinner = new JSpinner();

    public PhyMappingTableCellEditor(ArrayList<String> phys) {
        spinner.setModel(new SpinnerListModel(phys));
        spinner.setBorder(new EmptyBorder(0,0,0,0)); 
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,
        int row, int column) {
        spinner.setValue(value);
        return spinner;
    }

    @Override
    public Object getCellEditorValue() {
        return spinner.getValue();
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:3)

假设您从单元格到单元格选项卡时自定义编辑器工作正常,则问题是当表格失去焦点时,您需要手动停止对单元格进行编辑。

结帐Table Stop Editing。它显示了当表失去焦点时如何停止对单元格的编辑。该解决方案适用于正在编辑的任何单元格,而不仅仅是您的自定义编辑器。

答案 1 :(得分:1)

我有类似的问题。如果使用键盘编辑了微调器值,然后单击另一个表单元格而没有先按Enter键,则编辑将丢失。我通过覆盖AbstractCellEditor.stopCellEditing()来解决它:

@Override
public boolean stopCellEditing() {
    try {
        spinner.commitEdit();
    }
    catch (ParseException ex) {
        // Do nothing
    }
    return super.stopCellEditing();
}