From 94b0ca2ccf01d72dfeca7a104ecb7732474a34bb Mon Sep 17 00:00:00 2001 From: Jan Eglinger Date: Fri, 28 Mar 2025 16:13:39 +0100 Subject: [PATCH] SwingObjectWidget: set values by string comparison Previously, we were trying to set the JComboBox value with a new instance of the object. We don't always have the possibility to keep a list of the allowed choices for the current model, nor can we override the `equals()` method for the `Object`s of this widget instance. So we have to fall back to comparing all combobox items to the current value by their `toString()` and `ObjectService.getName()` strings. --- .../ui/swing/widget/SwingObjectWidget.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/scijava/ui/swing/widget/SwingObjectWidget.java b/src/main/java/org/scijava/ui/swing/widget/SwingObjectWidget.java index b470ebd..0dfe722 100644 --- a/src/main/java/org/scijava/ui/swing/widget/SwingObjectWidget.java +++ b/src/main/java/org/scijava/ui/swing/widget/SwingObjectWidget.java @@ -108,8 +108,23 @@ public boolean supports(final WidgetModel model) { @Override public void doRefresh() { final Object value = get().getValue(); - if (value == comboBox.getSelectedItem()) return; // no change - comboBox.setSelectedItem(value); + if (comboBox.getSelectedItem().toString().equals(nameOf(value))) return; // no change + updateComboBox(comboBox, value); + } + + private void updateComboBox(final JComboBox comboBox, final Object value) { + for (int i = 0; i < comboBox.getModel().getSize(); i++) + { + if (comboBox.getItemAt(i).toString().equals(nameOf(value))) + { + comboBox.setSelectedIndex(i); + break; + } + } + } + + private String nameOf(final Object value) { + return value == null ? "" : context().service(ObjectService.class).getName(value); } private class NamedObjectCellRenderer implements ListCellRenderer { @@ -120,7 +135,7 @@ private class NamedObjectCellRenderer implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - renderer.setText(value == null ? "" : context().service(ObjectService.class).getName(value)); + renderer.setText(nameOf(value)); renderer.setToolTipText(value == null ? null : value.toString()); return renderer; }