【问题标题】:Lose Focus and Commit Edit on a JSpinner when clicking outside the spinner在微调器外部单击时失去焦点并在 JSpinner 上提交编辑
【发布时间】:2014-07-31 21:09:36
【问题描述】:

我有一个 JTable,它的单元格编辑器是 JSpinners。我正在使用自定义单元格编辑器类来完成此操作。我的 JPanel 中还有一些其他组件。当用户正在编辑其中一个单元格(即 JSpinner 具有焦点)然后与其他组件之一交互而没有先按 enter 或失去焦点时,就会出现我的问题。我希望 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();
    }
}

提前致谢!

【问题讨论】:

  • 考虑提供一个可运行的示例,该示例启动了您的问题。我发现调用stopCellEditing时,需要调用commitEdit来确保值在调用getCellEditorValue之前被spinner验证过

标签: java swing jtable focus jspinner


【解决方案1】:

假设您的自定义编辑器在您从一个单元格切换到另一个单元格时正常工作,那么问题是您需要在表格失去焦点时手动停止对单元格的编辑。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多