Как отловить ошибку, выданную слушателем действия? - PullRequest
0 голосов
/ 10 ноября 2019

Я создаю поворотную панель, которая содержит поле со списком, которое может изменить масштаб изображения. Я решил отделить код комбинированного окна масштаба от его собственного класса, поскольку он используется в программе. Масштаб может быть недействительным, поэтому я хочу каким-то образом предупредить пользователя о том, что был выбран неверный масштаб. В любом другом случае я ловлю сообщения об ошибках и отображаю их в плавающем окне, но я хочу сделать его более модульным (например, у меня есть одна страница с плавающими окнами, а другая - для входа в файл). Могу ли я поймать ошибку, выданную слушателем действия?

Это класс, в который инкапсулировано поле со списком. Вы можете видеть, что слушатель действия находится внутри.

public class Scale {

    public JComboBox<Integer> scaleComboBox;
    private Integer defaultScale;
    private Panel Panel;

    public Scale(Integer defaultScale, Integer[] scales, Panel Panel) {
        this.defaultScale = defaultScale;
        this.Panel = panel;

        this.scaleComboBox = new JComboBox<Integer>(scales);
        this.scaleComboBox.setEditable(true);
        this.scaleComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                scaleChangeRequested();
            }
        });
        this.scaleComboBox.setSelectedItem(defaultScale);
    }

    private void scaleChangeRequested() {
        double newScale = defaultScale;
        Object x = scaleComboBox.getSelectedItem();
        if (x instanceof String) {
            try {
                newScale = Float.parseFloat((String)x);
            } catch (NumberFormatException e) {
                scaleComboBox.setSelectedItem(newScale = defaultScale);
            }
        } else if (x instanceof Number) {
            newScale = ((Number)x).doubleValue();
        }
        if (newScale < Panel.MIN_SCALE) {
            scaleComboBox.setSelectedItem(newScale = defaultScale);
            throw new IllegalArgumentException("Scale must be at least " + Panel.MIN_SCALE);
        }
        panel.setScale(newScale);
    }
}

Вы можете увидеть «IllegalArgumentException» внизу, если есть проблема. Есть ли хороший способ справиться с этим?

...