如何使JFrame模态像JOptionPane? [英] How can I make a JFrame modal like a JOptionPane?

查看:66
本文介绍了如何使JFrame模态像JOptionPane?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我将提出问题,然后解释该应用程序.

First, I will make the question and then I will explain the application.

如何使JFrame的行为类似于JOptionPanes? (教程没有帮助),即

How can I make JFrames to behave like JOptionPanes? (tutorial didn't help) i.e.

[Show content >> return a value].另外,我需要它成为

[Show content >> return a value]. Aditionally I need it to be

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

我已经使确定"按钮获得了想要的答案(在控制台中显示),但是我不知道在哪里放置return语句

I already made the "Ok" button get the answer i want (displaying it in the console), but i cant figure out where to put the return statement

我希望功能类似于

public static String getAnswer(Args, Answer)

Args,可能包含字段名称,数据类型,最大长度和

Args, may contain name of the field, type of data, maximum lenght, and

Answer,是用户提供信息并单击确定"后要修改的对象

Answer, is the object to be modified, after the user gives the information and clicks "ok"

总有论据和答案.例如(查看屏幕截图,以查看我需要如何显示最复杂"类型的消息,尽管它是不完整的,因为它需要根据数据类型显示不同种类的组件.)

There is always and argument and an answer for it. e.g. (look at the screenshot, to see how the "most complex" type of message I need to display, it is incomplete though, because it needs to display different kind of components depending on the data type).

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

到目前为止,我要做的是显示一个具有所需内容的JFrame(即对话框),并单击一个按钮以在控制台中向我显示答案.

What i did so far, is to display a JFrame (which is the dialog) with the desired content and make a button to show me the answer in console.

如何构建JFrame?我有4个类,其中三个类在屏幕截图下方进行了描述,最后一个类是构建一个包含其他三个面板的JPanel并将其添加到JFrame中.如果您想查看代码单击.

How do I build the JFrame? I have 4 classes, three of the classes are described below the screenshot and the last one, build a JPanel that contains the three other panels and add it to the JFrame. If you want to see the code click.

为什么我不使用JDialog,因为它需要一个我没有的父框架.我需要从另一个非Java应用程序中显示它,因此,它必须已经是最上面的框架.

Why I dont use JDialog, because it needs a parent frame which I dont have. I need to display this from another not java application, so this, must already be the top frame.



您可能不想阅读这篇文章,但是如果您有兴趣阅读我在做什么,请继续:



You may not want to read this but if you are interested in reading what i'm i doing, please go ahead:

我知道,通过使用JOptionPane.showMessageDialog()等,我的问题可能会解决,但我无法解决让它满足我的需求的问题. JOptionPane上显示的内容似乎仅限于我,而且我不知道如何保持控制力,也不知道我放入它的孩子,一切都会改变其行为.

Im aware, that by using JOptionPane.showMessageDialog() and so on, my problem may be solved, but I cant figure out hot to make it fit my needs. The content showed on a JOptionPane seems limited to me and I don't know how to keep control nor reference to the childrens I put into it, everything changes its behaviour .

我必须创建五个不同的对话框,这些对话框会将值返回到另一个应用程序(痛苦的oracle形式6i).对话框的类型为:

I have to make five different dialogs that would return values to another application (painful oracle forms 6i). The types of dialogs are:

  • 打印"对话框,其中显示了打印机列表或导出到文件"选项
  • 消息对话框,显示html内容(如电子邮件预览),并带有确定"按钮.
  • 是/否对话框,要求用户确认,类似于消息对话框.
  • 参数表,要求用户根据选择的字符串或字符串数​​组提供一些信息,它要求的信息.
  • 值列表(基于select语句)显示结果,就像plsql开发人员一样.
  • Print dialog, which shows a list of printers or the option "Export to file"
  • Message dialog, shows html content (like an e-mail preview) and has an "Ok" button.
  • Yes/No dialog, asks for a confirmation from the user, works like message dialog.
  • Parameter form, asks the user to give some information, the information it asks, is based on a select or an array of strings.
  • List of values, based on a select statement, shows the result just like plsql developer would do.

这是最后一项(Parameter form)的屏幕截图,在示例中,evey项的类型为Month,答案将用其值填充.

Here is a screenshot of the last item (Parameter form), in the example, evey item is type Month, and the answer would be filled with its value.

如您所见,该框架分为3个块(我将其划分为3个类,分别为TopPanelMidPanelBotPanel):消息对话框,用户输入和命令按钮.

As you can see, the frame is divided by 3 blocks (which I made as 3 classes TopPanel, MidPanel and BotPanel): Message dialog, User inputs and command buttons respectively.

TopPanel,从JScrollPane扩展并创建JEditorPane,因为它可能显示html内容

TopPanel, extends from JScrollPane and creates a JEditorPane, cuz it may show html content

MidPanel,从JScrollPane扩展(仅为列表中的最后两个对话框创建),并基于一个对象创建字段,该对象作为参数传递给用户,并作为参数传递给用户,需要在Java中进行检查,因为它可以是日期,文本字段或基于选择语句的组合框(在图中,根据对数据库的查询,一年中有12个月).

MidPanel, extends from JScrollPane (this one, is created only for the last two dialogs in the list) and creates fields based on an object that forms pass as parameters to be asked to the user, the input to this, need to be checked in java as it can be a date, a textField or a combo box based on a select statement (in the picture, there are the 12 months of the year based on a query to the database).

BotPanel具有用于java给出的答案的控件,例如,参数列表或是/否"对话框的答案.此面板随各种对话框而变化.例如对于是/否对话框,它具有是"和否"按钮,这些按钮将使java返回true或false,但是对于参数形式对话框,如果出现,它将返回错误消息,并且包含包含以下信息的对象用户选择了.

BotPanel has the controls for the answer that java would give to forms, say, the list of parameters or the answer to a Yes/No dialog. This panels, changes with every kind of dialog. e.g. For a yes/no dialog, it has "Yes" and "No" buttons that will make java, return true or false, but for a parameter form dialog, it would return an error message if ocurred and the Object that contains the information that the user choosed.

推荐答案

同样,您可以将任何复杂的gui放入JOptionPane中. JOptionPane show方法的第二个参数采用一个Object,该Object可以是任何Swing组件.例如:

Again, you can put any complex gui into a JOptionPane. The JOptionPane show method's second parameter takes an Object which can be any Swing component. For example:

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();
         }
      });
   }
}

这篇关于如何使JFrame模态像JOptionPane?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆