Java 如何使JFrame模式像JOptionPane一样?

Java 如何使JFrame模式像JOptionPane一样?,java,swing,modal-dialog,Java,Swing,Modal Dialog,首先,我会提出问题,然后我会解释申请 如何使JFrames表现得像JOptionPanes?i、 e [显示内容>>返回值]。传统上我需要它 [显示帧>>询问信息>>修改作为参数传递给构造函数的对象>>返回内容] 我已经通过Ok按钮得到了我想要在控制台中显示的答案,但是我不知道把return语句放在哪里 我希望函数是这样的 public static String getAnswer(Args, Answer) 参数,可以包含字段名称、数据类型、最大长度和长度 回答,在用户提供信息并单击ok后

首先,我会提出问题,然后我会解释申请

如何使JFrames表现得像JOptionPanes?i、 e

[显示内容>>返回值]。传统上我需要它

[显示帧>>询问信息>>修改作为参数传递给构造函数的对象>>返回内容]

我已经通过Ok按钮得到了我想要在控制台中显示的答案,但是我不知道把return语句放在哪里

我希望函数是这样的

public static String getAnswer(Args, Answer)
参数,可以包含字段名称、数据类型、最大长度和长度

回答,在用户提供信息并单击ok后,是否要修改对象

总有争论和答案。e、 g.查看屏幕截图,了解我需要显示的最复杂类型的消息是如何显示的,但它是不完整的,因为它需要根据数据类型显示不同类型的组件

| 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上显示的内容似乎仅限于我自己,我不知道如何控制,也不知道如何引用我放入其中的孩子,一切都会改变它的行为

我必须创建五个不同的对话框,将值返回到oracle forms 6i的另一个应用程序。对话框的类型有:

“打印”对话框,其中显示打印机列表或“导出到文件”选项 “消息”对话框,显示类似电子邮件预览的html内容,并具有“确定”按钮。 “是/否”对话框,要求用户确认,与“消息”对话框类似。 参数表单,要求用户提供一些信息,它所要求的信息基于一个select或一个字符串数组。 基于select语句的值列表显示结果,就像plsql开发人员所做的那样。 这里是最后一个item参数表单的屏幕截图,在示例中,evey item的类型是Month,答案将用它的值填充

如您所见,框架被3个块分割,我分别将其划分为3个类:TopPanel、MidPanel和BotPanel:消息对话框、用户输入和命令按钮

TopPanel,从JScrollPane扩展而来,创建了一个JEditorPane,因为它可以显示html内容

MidPanel是从JScrollPane扩展而来的,它仅为列表中的最后两个对话框创建,并基于一个对象创建字段,该对象作为参数传递给用户,需要在java中选中此字段的输入,因为它可以是日期、文本字段或基于图片中的select语句的组合框,根据对数据库的查询,有一年中的12个月


BotPanel具有java为表单提供的答案的控件,例如参数列表或是/否对话框的答案。此面板随各种对话框的变化而变化。e、 g.对于“是/否”对话框,它有“是”和“否”按钮,这些按钮将使java返回true或false,但对于参数窗体对话框,如果出现错误,它将返回错误消息以及包含用户选择的信息的对象。

同样,您可以将任何复杂的gui放入JOptionPane中。JOptionPane show方法的第二个参数接受一个对象,该对象可以是任何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();
         }
      });
   }
}

没有父级的JDialog是可能的-为什么不简单地将复杂的GUI/JPanel放入JOptionPane中?@HovercraftFullOfEels您认为太复杂了吗?我应该换个型号吗?我认为它很简单,比如主面板{Top{message},中间{changingContent},Bot{changinContent}有更简单的解决方案吗?我不是一个经验丰富的程序员。谢谢。@罗杰:不,不太复杂,一点也不复杂。运行下面的示例,您可以看到使用JOptionPane可以轻松完成此操作。您好!,这样很容易。非常感谢。现在,我有一个问题,在参数表单中,有一些字段是必需的,我如何控制,如果这些字段没有填充,窗口不会关闭?我知道我必须为每种字段创建文档监听器或格式化文本字段,但Ok按钮如何处理这一问题?我可以重新创建窗口,再次请求使用以前的输入填充信息,但显然,由于存在未创建的字段
基于对数据库的查询,重新查询不会很酷。我应该为这件事提个新问题吗?老兄!,你的速度!!,你很快就做了那个节目!再次感谢:我不知道你什么时候会再次连接,所以我提出了一个新问题