Не удается отобразить начальное значение в JOptionPane в JDialog

#java #swing #joptionpane

#java #swing #joptionpane

Вопрос:

Вероятно, это глупый вопрос, но я не могу понять, как это исправить. Я хочу, чтобы все мои JOptionPanes могли изменять размер, поэтому я внедряю их в JDialog. В конечном итоге мне придется преобразовать все мои вызовы showXxxDialog, поэтому я решил начать с showInputDialog. Все работает (диалоговое окно выглядит красиво и может изменять размер), за исключением того, что оно не будет отображать начальное значение на дисплее JOptionPane, даже если оно правильное в конструкторе JOptionPane. Вот мой код (тип сообщения — PLAIN_MESSAGE, но QUESTION_MESSAGE делает то же самое):

 public class MyOptionPane {

static Object showInputDialog(Object f,  Object message, String title, int messageType, 
      Icon ico, Object[] options, Object initValue) {

     JOptionPane pane = new JOptionPane(message, messageType, JOptionPane.OK_CANCEL_OPTION,
         ico, options,  initValue);

     JDialog dialog = pane.createDialog((Component) f, title);
     if (!dialog.isResizable()) {
         dialog.setResizable(true);
     }
     pane.setWantsInput(true);

     dialog.pack();              
     dialog.setVisible(true);           

     return pane.getInputValue();   

     }
 }
  

Помощь была бы высоко оценена!

Комментарии:

1. Пожалуйста, покажите нам пример того, как вы это вызываете. Кроме того, вы уверены, что начальное значение является частью массива options?

Ответ №1:

У меня есть хорошие и плохие новости, решение вашей проблемы заключается в включении строки: pane.setInitialSelectionValue(initValue); . Отлично, не так ли? Что ж, плохая новость заключается в том, что я не могу объяснить, почему он не вставляет initValue автоматически через конструктор. Надеюсь, кто-нибудь другой сможет использовать это и объяснить нам обоим.

 import javax.swing.*;
import java.awt.*;

public class MyOptionPane {

    static Object showInputDialog(Object f,  Object message, String title, int messageType,
                                  Icon ico, Object[] options, Object initValue) {


        JOptionPane pane = new JOptionPane(message, messageType, JOptionPane.OK_CANCEL_OPTION,
                ico, options,  initValue);

        JDialog dialog = pane.createDialog((Component) f, title);
        if (!dialog.isResizable()) {
            dialog.setResizable(true);
        }
        pane.setInitialSelectionValue(pane.getInitialValue()); // set it
        pane.setWantsInput(true);

        dialog.pack();
        dialog.setVisible(true);

        return pane.getInputValue();
    }
}
  

Комментарии:

1. @PaulMorrison, у меня не работает. Ну, да, я вижу значение в поле ввода. Однако приведенный выше код работает только тогда, когда вы указываете null для переменной «options». Когда вы предоставляете массив параметров, у вас должно отображаться поле со списком для компонента ввода, но я получаю несколько кнопок со значениями массива. Поэтому я бы все равно предположил, что что-то не так. Опять же, возможно, мой тестовый код неверен, поэтому вас попросили опубликовать ваш SSCCE, демонстрирующий проблему. Контекст использования метода также важен.

2. Спасибо, camickr, параметры равны нулю — вызывающий код: String ans = (Строка) MyOptionPane.showInputDialog(драйвер.фрейм, «Введите или измените текст», «Отредактируйте имя порта восходящего потока», JOptionPane. PLAIN_MESSAGE, null, нуль, передача по потоку);

3. @PaulMorrison, весь тестовый код должен быть опубликован вместе с вашим вопросом, чтобы мы могли скопировать / вставить / скомпилировать и протестировать. Я предположил, что приведенный здесь код будет работать в этом случае, однако, это не то, как этот метод из JOptionPane предназначен для постоянного использования. Оно предназначено для предоставления пользователю списка опций на выбор. Проверьте, как получить ввод пользователя из диалогового окна . Я предполагаю, что этот код больше не будет поддерживать эту функциональность по умолчанию.

4. Возможно, это не работает, потому что: «initialValue: выбор, который изначально выбран; если null, то изначально ничего не будет выбрано; имеет смысл, только если используются параметры » согласно JOptionPane Javadoc

5. Спасибо, @camickr, это был единственный способ, который я смог увидеть, чтобы вставить начальное значение. Вероятно, есть правильный способ — я еще немного покопаюсь! Реальная проблема в том, что IMHO документация для JOptionPane ужасна! Базовые функции showxxxDialog довольно хороши, но в тот момент, когда вы хотите сделать что-то нестандартное, вы не получаете никакой помощи вообще. Предположительно, конструкторы каким-то образом связаны с функциями showxxxDialog, но чрезвычайно сложно понять, как! Тем не менее, я думаю, что добиваюсь прогресса — с помощью всех вас! Спасибо! 🙂