Как я могу сделать JFrame модальным, как JOptionPane? - PullRequest
2 голосов
/ 05 января 2012

Сначала я задам вопрос, а затем объясню применение.

Как мне заставить JFrame с вести себя как JOptionPanes? ( учебник не помог ), т.е.

[Show content >> return a value]. Кроме того, мне нужно, чтобы это было

[Show the frame >> Ask information >> Modify an object passed as parameter to the constructor >> return something]

Я уже сделал, чтобы кнопка «ОК» получила нужный мне ответ (отображающий его в консоли), но я не могу понять, куда поместить оператор return

я хочу, чтобы эта функция была похожа на

public static String getAnswer(Args, Answer)

Args, может содержать название поля, тип данных, максимальную длину и

Answer, это объект, который будет изменен после того, как пользователь предоставит информацию и нажмет "ОК"

Всегда есть и аргумент, и ответ на него. например (посмотрите на скриншот, чтобы увидеть, как «самый сложный» тип сообщения, которое мне нужно отобразить, хотя и неполон, потому что должен отображать различные типы компонентов в зависимости от типа данных).

| Arg                  |   Answer     |
--------------------------------------
| Type   | fldName     |              |
--------------------------------------
| int    | Age:        | 22           |
| String | Name:       | Roger        |
| Date   | Birth:      | 31/10/1989   |

То, что я сделал до сих пор, - это отобразил JFrame (который является диалоговым окном) с желаемым содержимым и сделал кнопку, чтобы показать мне ответ в консоли.

Как мне построить JFrame? У меня есть 4 класса, три из которых описаны ниже на скриншоте, а последний - построить JPanel, который содержит три другие панели и добавить его в JFrame. Если вы хотите увидеть код , нажмите .

Почему я не использую JDialog, потому что ему нужен родительский фрейм, которого у меня нет. Мне нужно отобразить это из другого не Java-приложения, так что это, должно быть, уже верхний кадр.

<ч /> <ч /> Возможно, вы не захотите читать это, но если вы заинтересованы в чтении того, что я делаю, продолжайте:

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

Мне нужно сделать пять разных диалогов, которые бы возвращали значения другому приложению (болезненные формы оракула 6i). Типы диалогов:

  • Диалог печати , в котором отображается список принтеров или опция «Экспорт в файл»
  • Диалог сообщения , показывает HTML-контент (например, предварительный просмотр электронной почты) и имеет кнопку «ОК».
  • Да / Нет диалоговое окно , запрашивает подтверждение у пользователя, работает как диалоговое окно сообщения.
  • Форма параметра , просит пользователя предоставить некоторую информацию, информацию, которую он запрашивает, основана на выборке или массиве строк.
  • Список значений , основанный на операторе select, показывает результат так же, как и разработчик plsql.

Вот снимок экрана с последним элементом (Parameter form), в данном примере элемент evey имеет тип Month, и ответ будет заполнен его значением.

enter image description here

Как видите, кадр разделен на 3 блока (которые я сделал как 3 класса TopPanel, MidPanel и BotPanel): диалог сообщений, пользовательские вводы и кнопки команд соответственно.

TopPanel, расширяется от JScrollPane и создает JEditorPane, потому что он может отображать html-контент

MidPanel, расширяется от JScrollPane (этот создается только для двух последних диалоговых окон в списке) и создает поля на основе объекта, который формирует передачу в качестве параметров, запрашиваемых пользователю, входных данных для этого, необходимо проверить в java, так как это может быть дата, textField или поле со списком, основанное на операторе select (на рисунке 12 месяцев в году, основанных на запросе к базе данных).

BotPanel имеет элементы управления для ответа, который java будет давать формам, скажем, список параметров или ответ на диалог Да / Нет. Эта панель меняется с каждым видом диалога. например Для диалога да / нет, он имеет кнопки «Да» и «Нет», которые будут делать Java, возвращать истину или ложь, но для диалога формы параметров, он будет возвращать сообщение об ошибке, если происходит, и Объект, который содержит информацию пользователь выбрал.

1 Ответ

5 голосов
/ 05 января 2012

Опять же, вы можете поместить любой сложный графический интерфейс в JOptionPane.Второй параметр метода показа JOptionPane принимает Object, который может быть любым компонентом Swing.Например:

import java.awt.*;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

import com.roots.map.MapPanel.ControlPanel;

public class ComplexDialog extends JPanel {
   public static final String[] COMBO_LABELS = { "Nombre 1",
         "Identificacion 1", "Fecha 1", "Empresa 1", "Nombre 2",
         "Identificacion 2", "Fecha 2", "Empresa 2", "Nombre 3",
         "Identificacion 3", "Fecha 3", "Empresa 3", "Nombre 4",
         "Identificacion 4", "Fecha 4", "Empresa 4", "Nombre 5",
         "Identificacion 5", "Fecha 5", "Empresa 5", "Nombre 6",
         "Identificacion 6", "Fecha 6", "Empresa 6", "Nombre 7",
         "Identificacion 7", "Fecha 7", "Empresa 7" };
   public static final String[] COMBO_ITEMS = { "January", "February", "March",
         "April", "May", "June", "July", "August", "September", "October",
         "November", "December" };
   private JTextArea textarea = new JTextArea(15, 30);
   private Map<String, JComboBox> comboMap = new HashMap<String, JComboBox>();

   public ComplexDialog() {
      textarea.setLineWrap(true);
      textarea.setWrapStyleWord(true);
      for (int i = 0; i < 100; i++) {
         textarea.append("This is a really large text. ");
      }

      JPanel comboPanel = new JPanel(new GridBagLayout());
      for (int i = 0; i < COMBO_LABELS.length; i++) {
         addToComboPanel(comboPanel, COMBO_LABELS[i], i);
      }

      int eb = 5;
      setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
      add(new JScrollPane(textarea));
      add(Box.createVerticalStrut(5));
      JScrollPane comboPanelScroll = new JScrollPane(comboPanel);
      add(comboPanelScroll);

      comboPanelScroll.getViewport().setPreferredSize(
            textarea.getPreferredSize());
   }

   private void addToComboPanel(JPanel comboPanel, String labelText, int index) {
      GridBagConstraints gbc = new GridBagConstraints(0, index, 1, 1, 0.2, 1.0,
            GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0,
                  0, 5), 0, 0);
      comboPanel.add(new JLabel(labelText, SwingConstants.RIGHT), gbc);

      gbc = new GridBagConstraints(1, index, 1, 1, 1.0, 1.0,
            GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(
                  0, 0, 0, 0), 0, 0);
      JComboBox combo = new JComboBox(COMBO_ITEMS);
      comboMap.put(labelText, combo);
      comboPanel.add(combo, gbc);

   }

   public String getComboChoice(String key) {
      JComboBox combo = comboMap.get(key);
      if (combo != null) {
         return combo.getSelectedItem().toString();
      } else {
         return "";
      }
   }

   public String getTextAreaText() {
      return textarea.getText();
   }

   public int showDialog() {
      return JOptionPane.showOptionDialog(null, this, "Sirena",
            JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null,
            new String[] { "Aceptar", "Cancelar" }, "Aceptar");
   }

   private static void createAndShowGui() {
      ComplexDialog dlg = new ComplexDialog();
      int response = dlg.showDialog();
      if (response == 0) {
         System.out.println("JTextArea's text is:");
         System.err.println(dlg.getTextAreaText());

         System.out.println("Combo box selections are: ");
         for (String comboLabel : COMBO_LABELS) {

            System.out.printf("%20s: %s%n", comboLabel, dlg.getComboChoice(comboLabel));
         }
      }
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
...