Передача ввода из одного кадра в другой (JAVA) - PullRequest
0 голосов
/ 06 марта 2012

Вот в чем дело ...

У меня есть 2 программы с графическим интерфейсом.
Программа меню, которая в основном представляет собой рамку с кнопками продуктов питания, кнопки при нажатии открывают эту другую программу, вводКоличество Программа, которая представляет собой рамку с текстовым полем, кнопки для цифр, кнопки для отмены и подтверждения.К количеству, подтвержденному пользователем, будет обращаться программа меню из программы «Ввод количества» для сохранения в векторе, так что каждый раз, когда пользователь хочет заказать другие продукты питания, он просто нажимает другую кнопку и повторяет процесс.

Теперь я закодировал большую часть и получил все работоспособное, кроме одной вещи, значение, возвращаемое программой ввода количества, имеет эту задержку.

Это то, что я делаю шаг за шагом:

1) Щелкните элемент питания в меню, откроется окно «Количество ввода».
2) Я ввожу нужное число, оноотображается в текстовом поле корректно.
3) Я нажал подтвердить, что будет делать 3 вещи, во-первых, он сохраняет значение текстового поля в переменной, во-вторых, он вызовет метод dispose () и в-третьих, оператор печати, показывающийзначение переменной (для целей тестирования).
4) Затем программа меню проверяет, нажал ли пользователь кнопку «Подтвердить» в программе ввода, если «истина», то он вызовет метод в программе ввода с именем getQuantity (), которыйвозвращает значение переменной «количество» и сохраняет его в векторе.
5) После чего выполняет другой оператор печати, чтобы проверить правильность переданного значения, а затем вызывает метод print () для отображения имени упорядоченного элемента иэто записанное количество.

Вот скриншоты графического интерфейса и код будет ниже.

MENU GUI
1st order last order

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

Здесь я заказал маринару из морепродуктов и ввел количество 2
2nd order

Здесь я заказал последний товар, обжаренный на сковороде лосось и ввел количество 3

enter image description here

Как видно, первое записанное количество равно 0 для первого изделия Iзатем заказывается, когда я добавляю другой элемент, записывается количество первого элемента, но количество 2-го элемента не записывается .. то же самое идет после третьего элемента ... и количество 3-го элемента не записывается, даже если программа завершается:(

Как мне решить эту проблему?

Ответы [ 2 ]

6 голосов
/ 06 марта 2012

Мне кажется, я вижу вашу проблему, и на самом деле она проистекает из того, что вы не используете модальное диалоговое окно для получения своего ввода.Вы запрашиваете inputGUI до , с которым пользователь мог взаимодействовать.Подождите, пока я покажу вам небольшой пример того, что я имею в виду ...

Edit
Вот мой пример кода, который имеет модальный 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.

0 голосов
/ 06 марта 2012

Предположим, у меня есть два GUI-кадра f1 и f2. Теперь, нажав кнопку на f1, я хочу вызвать кадр f2, а также отправить некоторые данные из f1 (класс кадра) в f2 (класс кадра).
Один из возможных способов - объявить конструктор в f2, который принимает те же данные, что и параметры, которые я хотел отправить ему из f1.Now в кодировке фрейма f1, просто включает эти операторы:
f1.setVisible (false); // f1 становится невидимым f2 newFrame = new f2 (uname, pass); // uname и pass были взяты из текстовых полей f1 f2.setVisible (истина);

Я думаю, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...