如何制作像 JOptionPane 一样的 JFrame 模式? [英] How can I make a JFrame modal like a JOptionPane?

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

问题描述

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

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.

[显示内容>>返回一个值].另外我需要它是

[显示框架>>询问信息>>修改作为参数传递给构造函数的对象>>返回一些东西]

我已经让确定"按钮得到了我想要的答案(在控制台中显示),但我不知道在哪里放置 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,是要修改的对象,用户给出信息后点击ok"

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.



您可能不想阅读此内容,但如果您有兴趣阅读我正在做的事情,请继续阅读:

我知道,通过使用 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.

这是最后一项(参数形式)的截图,在例子中,每一项的类型都是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 中进行检查,因为它可以是日期、文本字段或基于 select 语句的组合框(在图片中,根据对数据库的查询,一年中有 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 对表单给出答案的控件,例如参数列表或 Yes/No 对话框的答案.这个面板会随着各种对话而变化.例如对于是/否对话框,它具有是"和否"按钮,这将使 java 返回 true 或 false,但对于参数表单对话框,如果发生,它将返回错误消息,并且 Object 包含以下信息用户选择.

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 方法的第二个参数接受一个可以是任何 Swing 组件的 Object.例如:

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

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

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