Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将输入从一个帧传递到另一个帧(JAVA)_Java_Swing_User Interface - Fatal编程技术网

将输入从一个帧传递到另一个帧(JAVA)

将输入从一个帧传递到另一个帧(JAVA),java,swing,user-interface,Java,Swing,User Interface,事情是这样的 我有两个GUI程序。 一个菜单程序,基本上是一个框架,有食物的按钮,当点击时按钮 打开另一个程序,一个输入量程序,它是一个带有文本字段、数字按钮、取消和确认按钮的框架。用户确认的数量将由菜单程序从输入数量程序中访问,并存储在向量中,因此,每当用户想要订购其他食品时,他只需单击另一个按钮并重复该过程 现在我已经编写了大部分代码,所有的东西都工作了,除了一件事,输入量程序返回的值有延迟 这是我一步一步做的: 1) 单击菜单中的食物项,将打开“输入数量”窗口。 2) 我输入了我想要的号码

事情是这样的

我有两个GUI程序。
一个菜单程序,基本上是一个框架,有食物的按钮,当点击时按钮 打开另一个程序,一个输入量程序,它是一个带有文本字段、数字按钮、取消和确认按钮的框架。用户确认的数量将由菜单程序从输入数量程序中访问,并存储在向量中,因此,每当用户想要订购其他食品时,他只需单击另一个按钮并重复该过程

现在我已经编写了大部分代码,所有的东西都工作了,除了一件事,输入量程序返回的值有延迟

这是我一步一步做的:

1) 单击菜单中的食物项,将打开“输入数量”窗口。
2) 我输入了我想要的号码,它正确地显示在文本框中。
3) 我按下confirm,它将做3件事,首先它将文本字段的值存储到一个变量,其次它将调用dispose()方法,第三个是显示变量值的打印语句(用于测试)。
4) 然后,菜单程序检查用户是否已按下输入程序中的确认按钮,如果为真,则应调用输入程序中名为getQuantity()的方法,该方法返回变量“quantity”的值并将其存储在向量中。
5) 之后,执行另一个print语句来检查传递的值是否正确,然后调用print()方法来显示已订购的项目名称及其记录的数量

下面是GUI的屏幕截图,下面是代码


输入数量程序中确认按钮的操作执行方法:

private void ConfirmButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
    // TODO add your handling code here:
    confirmed = true;
    q= textField.getText().toString();
    quantity =Integer.parseInt(q) ;
    System.out.println("getQTY method inside Input Quantity Interface:" +getQuantity());
    System.out.println("Quantity from confirmButton in Input Quantity Interface actionPerformed: "+quantity);

    //getQuantity();
}                            
执行上述步骤2的菜单程序中菜单项按钮的操作侦听器类:

class f implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) 
    {
         inputGUI.setVisible(true);
         int  q =0;

          q=inputGUI.getQuantity(); //call method to get value from Input Program

          System.out.println("Quantity inside Menu actionperformed from AskQuantity interface: "+q);

         orderedQuantity.add(q); //int vector
         textArea.append("\n"+e.getActionCommand()+"\t"+ q);
         orderedItems.add(e.getActionCommand());  //String vector
         print();
         /*
         System.out.println("Enter QTY: ");
         int qty = in.nextInt();
         orderedQuantity.add(qty);
         print();*/
   }
以下是控制台中打印语句的屏幕截图:
在这里,我首先点了南瓜汤,我输入了1的数量

在这里,我点了海鲜马里纳拉,并输入了2个

在这里,我点了最后一道菜,煎鲑鱼,并输入了3份

正如您所看到的,我订购的第一个项目的第一个记录数量为0,然后当我添加另一个项目时,第一个项目的数量被记录,但第二个项目的数量没有记录..第三个项目之后也是如此。。。即使程序终止,也不会记录第三项的数量:(


如何解决这个问题?

我想我看到了你的问题,事实上,它直接源于你没有使用模式对话框来获取输入。你在用户有机会与inputGUI交互之前查询它。请稍候,我向你展示一个小示例,说明我的意思

编辑
下面是我的示例代码,它有一个模态JDialog和一个JFrame,两者都充当主JFrame的对话框,并且都使用相同的JPanel作为输入。区别在于模态JDialog将在主JFrame的代码变为可见时冻结该代码,直到它变为不可见时才会恢复,因此代码将等待让用户在对话框进行之前处理它,其中包含了所有的差异

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

public class DialogExample {
   private static void createAndShowGui() {
      JFrame frame = new JFrame("Dialog Example");
      MainPanel mainPanel = new MainPanel(frame);

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

class MainPanel extends JPanel {
   private InputPanel inputPanel = new InputPanel();
   private JTextField responseField = new JTextField(10);
   private JDialog inputDialog;
   private JFrame inputFrame;

   public MainPanel(final JFrame mainJFrame) {
      responseField.setEditable(false);
      responseField.setFocusable(false);

      add(responseField);
      add(new JButton(new AbstractAction("Open Input Modal Dialog") {

         @Override
         public void actionPerformed(ActionEvent e) {
            if (inputDialog == null) {
               inputDialog = new JDialog(mainJFrame, "Input Dialog", true);
            }
            inputDialog.getContentPane().add(inputPanel);
            inputDialog.pack();
            inputDialog.setLocationRelativeTo(mainJFrame);
            inputDialog.setVisible(true);  

            // all code is now suspended at this point until the dialog has been 
            // made invisible

            if (inputPanel.isConfirmed()) {
               responseField.setText(inputPanel.getInputFieldText());
               inputPanel.setConfirmed(false);
            }
         }
      }));
      add(new JButton(new AbstractAction("Open Input JFrame") {

         @Override
         public void actionPerformed(ActionEvent e) {
            if (inputFrame == null) {
               inputFrame = new JFrame("Input Frame");
            }

            inputFrame.getContentPane().add(inputPanel);
            inputFrame.pack();
            inputFrame.setLocationRelativeTo(mainJFrame);
            inputFrame.setVisible(true);  

            // all code continues whether or not the inputFrame has been
            // dealt with or not.

            if (inputPanel.isConfirmed()) {
               responseField.setText(inputPanel.getInputFieldText());
               inputPanel.setConfirmed(false);
            }

         }
      }));
   }
}

class InputPanel extends JPanel {
   private JTextField inputField = new JTextField(10);
   private JButton confirmBtn = new JButton("Confirm");
   private JButton cancelBtn = new JButton("Cancel");
   private boolean confirmed = false;

   public InputPanel() {
      add(inputField);
      add(confirmBtn);
      add(cancelBtn);

      confirmBtn.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            confirmed = true;
            Window win = SwingUtilities.getWindowAncestor(InputPanel.this);
            win.setVisible(false);
         }
      });
      cancelBtn.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            confirmed = false;
            Window win = SwingUtilities.getWindowAncestor(InputPanel.this);
            win.setVisible(false);
         }
      });
   }

   public boolean isConfirmed() {
      return confirmed;
   }

   public void setConfirmed(boolean confirmed) {
      this.confirmed = confirmed;
   }

   public String getInputFieldText() {
      return inputField.getText();
   }
}

因此解决方案:使用模态JDialog。

假设我有两个GUI框架f1和f2。现在,通过单击f1上的按钮,我想调用框架f2,并将一些数据从f1(框架类)发送到f2(框架类)。
一种可能的方法是在f2中声明一个构造函数,它使用与我想从f1发送给它的参数相同的数据。现在在f1帧的编码中只包含以下语句:
f1.setVisible(false);//f1不可见 f2 newFrame=newf2(uname,pass);//uname和pass已从f1的文本字段中获取 f2.设置可见(真)


我认为这将解决您的问题。

我不确定我们是否可以在没有代码的情况下帮助您。有多少代码?很难说,除了“足以说明问题,但不能用不相关的代码压倒我们。”最好是创建并发布一个,但这需要您付出大量的努力。如果问题很复杂,并且没有简单的解决方案,那么这通常是最好的方法。幸运的是。另外,我想知道依赖窗口是否应该是一个对话框,如JOptionPane或JDialog,而不是另一个JFrame。请理解se dialogs可以接受加载到gills上的JPanel,它有一个复杂的GUI,所以不要认为它们只是为了简单的交互,事实上远远不是。嗯……事实上……我选择将输入程序作为一个框架,这样我就可以添加按钮和文本字段。我将编辑问题并发布一些代码(我的代码很混乱,但lol)还有GUI的屏幕截图,这样你就明白了。你应该使用java.Util.List而不是Vector。@凯文:同样,你可以在对话框中添加按钮和文本字段。如果第二个窗口依赖于第一个窗口,也就是说,如果没有第一个窗口,它甚至不应该存在,那么它应该是一个对话框。我明白了。我将测试你的示例代码,以便完全理解它。谢谢你的反馈。我确信这是我问题的解决方案…但是我在实现我的GUI时遇到了问题。我使用Netbeans的GUI Builder创建了菜单界面。我将在public
MainPanel(final JFrame mainJFrame)中放置什么作为框架参数
…我的主框架类称为Test,它扩展了JFrame。我尝试输入
MainPanel(new Test());
但什么都没有显示,甚至菜单界面也没有显示。我知道一些GUI的手动编码。所以我对这个例子有点了解。但没人让它工作。:)这很有帮助。再次感谢!:)我昨天真的试过了…但它把其他的事情都搞砸了。所以是的,我没有解决我的问题,无论如何谢谢。。