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

时间:2012-03-06 00:42:28

标签: java swing user-interface

这就是......

我有2个GUI程序 一个菜单程序,它基本上是一个包含食物项按钮的框架,点击时按钮 打开另一个程序,一个输入数量程序,它是一个带有文本字段的框架,数字按钮,取消和确认按钮。菜单程序将从输入数量程序访问用户确认的数量,以存储在矢量中,这样每次用户想要订购其他食品时,他只需点击另一个按钮并重复该过程。 / p>

现在我编写了大部分内容并且除了一件事之外一切都正常工作,输入数量计划返回的值有这个延迟的事情。

这就是我一步一步做的事情:

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

以下是GUI的屏幕截图,代码将在其下方。

MENU GUI
1st order last order

输入数量计划中CONFIRM BUTTON的ActionPerformed方法:

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 1st Order

在这里,我订购了海鲜marinara并输入了2的数量 2nd order

在这里,我订购了最后一个项目,煎三文鱼,并输入了数量3

enter image description here

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

我认为我看到了你的问题,实际上它直接源于你没有使用模态对话框来获取你的输入。在用户有机会与之交互之前,您正在查询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。

答案 1 :(得分:0)

假设我有两个GUI帧f1和f2。现在通过单击f1上的按钮,我想调用帧f2并从f1(帧类)向f2(帧类)发送一些数据。
一种可能的方法是在f2中声明一个构造函数,它接受与我想从f1发送给它的参数相同的数据。现在在帧f1的编码中只包括这些语句:
f1.setVisible(false); // f1变得不可见 f2 newFrame = new f2(uname,pass); // uname和pass取自f1的文本字段 f2.setVisible(真);

我认为这会解决你的问题。