java swing получить все редактируемые текстовые поля jformatted и вычислить? - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь сделать калькулятор, который в основном похож на это: пользователь вводит около 18-19 значений, затем он нажимает кнопку, и результат равен его сумме ввода, деленной на количество полей. Тем не менее, это гораздо сложнее, чем это. Пользователь может указать некоторые опции, которые добавляют дополнительные поля ввода (в основном, сделать опцию, где он делает редактируемое текстовое поле jformatted текстовым, когда по умолчанию оно недоступно для редактирования), это может быть огромной потерей времени, так как мне нужно написать огромный оператор IF, который я ненавижу делать. По сути, пользователь может активировать некоторые jSpinner, которые значительно расширяют возможности редактирования jFormattedTExtFields, чем параметры по умолчанию. Я спрашиваю, как вы можете проверить, какие jformattedtextfields являются редактируемыми, а какие нет, а затем выполнить операции с теми, которые являются редактируемыми?

Ответы [ 4 ]

2 голосов
/ 30 декабря 2011

добавьте DocumentListener ко всем JFormattedTextFields и возьмите значение из экземпляра Number, например для Float

if (someTextField.isEditable()){ 
    float newValue = (((Number) resistorValue.getValue()).floatValue());
}
1 голос
/ 30 декабря 2011

Похоже, ваша модель может быть достаточно сложной для использования шаблона Model View Controller .Ваша модель будет указывать, какие поля имеют смысл отображать для данного состояния контроллера.Это также гарантирует, что отображаемый ответ будет аналогичным образом.Этот пример может предложить дополнительные рекомендации.

1 голос
/ 30 декабря 2011

Простейшим было бы добавить JFormattedTextField в массив всякий раз, когда вы создаете новый.Затем, при необходимости, выполните итерацию по массиву и проверьте, доступен ли он для редактирования.

1 голос
/ 30 декабря 2011

Прежде всего, определите контейнер, в котором размещено поле jformattedtext, затем просто используйте API JContainer для обхода всех дочерних компонентов и отфильтруйте все компоненты поля jformattedtext, используя instanceof.

Например:

public static int calcIfEnabled(Container container) {
    int finalResult = 0;
    for (Component c : container.getComponents()) {
        if (c instanceof JFormattedTextField && c.isEnabled() && ((JFormattedTextField) c).isEditable()) {
            finalResult += Integer.parseInt(((JFormattedTextField) c).getText());
        }
    }
    return finalResult;
}

UPD: Конечно, вы можете включить все дочерние компоненты с помощью рекурсии и передать основной контейнер (JFrame), но это будет не так хорошо с точки зрения производительности.

public static int calcIfEnabled(Container container) {
    int finalResult = 0;
    for (Component c : container.getComponents()) {
        if (c instanceof JFormattedTextField && c.isEnabled() && ((JFormattedTextField) c).isEditable()) {
            finalResult += Integer.parseInt(((JFormattedTextField) c).getText());
        } else if (c instanceof Container) {
            finalResult += calcIfEnabled((Container) c);
        }
    }
    return finalResult;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...