Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
171 views
in Technique[技术] by (71.8m points)

user interface - Java - GUI: Passing values from frame to another

I am making a panel project that calls three panels. Panel one holds all information and the other two panels are panels that open up when I press a button. How it works is I call the first panel, press a button, second panel opens. Then in the second panel I plug in a password. If it is correct, a third panel will open. I need to call values from the first panel into the third panel. I know how to use constructors, accessors and mutators, but the values I need are generated in an event when I press a button. I am trying to figure out how to call those values from the event into the third panel. Essentially, the values are counters, sub-total, tax, and total for all transactions of the duration of the program. Here is my code.

Main Class:

import javax.swing.*;

public class AppleRegister {

    public static void main(String[] args) 
    {
        double subTotalp2 = 0, taxP2 = 0, realTotalp2 = 0;

        JFrame frame = new JFrame("Apple Crazy Cola Cash (Apple IIC) Register");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        AppleRegisterPanel panel = new AppleRegisterPanel
                (subTotalp2, taxP2, realTotalp2);

        frame.getContentPane().add(panel);

        frame.pack();
        frame.setVisible(true);
    }
}

First Panel:

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

public class AppleRegisterPanel extends JPanel
{
private JButton button1, button2, button3, button4, button5, button6;
private JLabel label1, label2, label3, label4, label5, label6, label7;
private JTextField text, text1, text2, text3, text4, text5, text6, text7, text8;
private JTextArea area ;
private JPanel panel, panel2, panel3, panel4;
private int counter, counter2, counter3, counter4, counterp21, counterp22, 
     counterp23, counterp24;
private String string;
private final double MD_TAX = 0.06;
private double subTotal, realTotal, tax, subTotalp2, realTotalp2, taxP2;
private double num100, num50, num20, num10, num5, num1, num25cents, num10cents,
      num5cents, num1cents;

public AppleRegisterPanel(double subTotalp2, double taxP2, double realTotalp2)
{
    this.subTotalp2 = subTotalp2;
    this.taxP2 = taxP2;
    this.realTotalp2 = realTotalp2;

    setLayout(new BorderLayout());
    text = new JTextField(10);
    text1 = new JTextField(5);
    text2 = new JTextField(5);
    text3 = new JTextField(5);
    text4 = new JTextField(5);
    text5 = new JTextField(10);
    text6 = new JTextField(10);
    text7 = new JTextField(10);
    text8 = new JTextField(10);
    area = new JTextArea();

    button1 = new JButton("Child");
    button2 = new JButton("Medium");
    button3 = new JButton("Large");
    button4 = new JButton("Ex Large");
    button5 = new JButton("Close Out Register");
    button6 = new JButton("Complete Transaction");

    panel = new JPanel();
    panel.setPreferredSize(new Dimension(240,250));
    panel.setBackground(Color.cyan);
    add(panel, BorderLayout.WEST);
    panel.add(button1);
    button1.addActionListener(new TempListener2());
    panel.add(text1);
    panel.add(Box.createRigidArea(new Dimension(0,20)));
    panel.add(button2);
    button2.addActionListener(new TempListener2());
    panel.add(text2);
    panel.add(Box.createRigidArea(new Dimension(0,20)));
    panel.add(button3);
    button3.addActionListener(new TempListener2());
    panel.add(text3);
    panel.add(Box.createRigidArea(new Dimension(0,20)));
    panel.add(button4);
    button4.addActionListener(new TempListener2());
    panel.add(text4);
    panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));

    panel2 = new JPanel();
    label6 = new JLabel("Change");
    panel2.setPreferredSize(new Dimension(270,250));
    panel2.setBackground(Color.cyan);
    add(panel2, BorderLayout.EAST);
    panel2.add(button5);
    button5.addActionListener(new TempListener());
    panel2.add(label6);
    panel2.add(area);
    panel2.add(button6);
    button6.addActionListener(new TempListener1());
    panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));

    panel3 = new JPanel();
    label1 = new JLabel("Apple Crazy Cola Cash (Apple IIC) Register ");
    label7 = new JLabel(" By Robert Burns");
    panel3.setPreferredSize(new Dimension(50,50));
    panel3.setBackground(Color.cyan);
    add(panel3, BorderLayout.NORTH);
    panel3.add(label1);
    panel3.add(label7);

    panel4 = new JPanel();
    label1 = new JLabel("Sub-Total");
    label2 = new JLabel("Tax");
    label3 = new JLabel("Total");
    label4 = new JLabel("Payment");
    label5 = new JLabel("Change Owed");
    panel4.setPreferredSize(new Dimension(140,250));
    panel4.setBackground(Color.cyan);
    add(panel4, BorderLayout.CENTER);
    panel4.add(label1);
    panel4.add(text);
    panel4.add(label2);
    panel4.add(text5);
    panel4.add(label3);
    panel4.add(text6);
    panel4.add(label4);
    panel4.add(text7);
    text7.addActionListener(new TempListener3());
    panel4.add(label5);
    panel4.add(text8);

}

private class TempListener implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {

        if (event.getSource() == button5)
        {
            JFrame frame3 = new JFrame("Apple Crazy Cola Cash (Apple
                            IIC) Register");
            frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            AppleRegisterPanel3 panel = new AppleRegisterPanel3();
            frame3.getContentPane().add(panel);

            frame3.pack();
            frame3.setVisible(true);
        }
    }
}

private class TempListener1 implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {

        if (event.getSource() == button6)
        {
            counter = 0;
            text1.setText(Integer.toString(counter));
            counter2 = 0;
            text2.setText(Integer.toString(counter2));
            counter3 = 0;
            text3.setText(Integer.toString(counter3));
            counter4 = 0;
            text4.setText(Integer.toString(counter4));
            subTotal = 0;
            text.setText(Double.toString(subTotal));
            tax = 0;
            text5.setText(Double.toString(tax));
            realTotal = 0;
            text6.setText(Double.toString(realTotal));
            text7.setText("");
            text8.setText("");
        }
    }
}

private class TempListener2 implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        DecimalFormat df = new DecimalFormat("#.##");

        if (event.getSource() == button1)
        {
            counter++;
            string = text1.getText();
            text1.setText(Integer.toString(counter));

            subTotal += counter * 0.90;
            string = text.getText();
            text.setText(df.format(subTotal));

            tax += subTotal * MD_TAX;
            string = text5.getText();
            text5.setText(df.format(tax));

            realTotal += subTotal + tax;
            string = text6.getText();
            text6.setText(df.format(realTotal));

            counterp21++;
            subTotalp2 += counterp21 * 0.90;
            taxP2 += subTotalp2 * MD_TAX;
            realTotalp2 += subTotalp2 * taxP2;
        }

        if (event.getSource() == button2)
        {
            counter2++;
            string = text2.getText();
            text2.setText(Integer.toString(counter2));

            subTotal += counter2 * 1.40;
            string = text.getText();
            text.setText(df.format(subTotal));

            tax += subTotal * MD_TAX;
            string = text5.getText();
            text5.setText(df.format(tax));

            realTotal += subTotal + tax;
            string = text6.getText();
            text6.setText(df.format(realTotal));

            counterp22++;
            subTotalp2 += counterp22 * 1.40;
            taxP2 += subTotalp2 * MD_TAX;
            realTotalp2 += subTotalp2 * taxP2;
        }

        if (event.getSource() == button3)
        {
            counter3++;
            string = text3.getText();
            text3.setText(Integer.toString(counter3));

            subTotal += counter3 * 1.75;
            string = text.getText();
            text.setText(df.format(subTotal));

            tax += subTotal * MD_TAX;
            string = text5.getText();
            text5.setText(df.format(tax));

            realTotal += subTotal + tax;
            string = text6.getText();
            text6.setText(df.format(realTotal));

            counterp23++;
            subTotalp2 += counterp23 * 1.75;
            taxP2 += subTotalp2 * MD_TAX;
            realTotalp2 += subTotalp2 * taxP2;
        }

        if (event.getSource() == button4)
        {
            counter4++;
            string = text4.getText();
            text4.setText(Integer.toString(counter4));

            subTotal += counter4 * 2.00;
            string = text.getText();
            text.setText(df.format(subTotal));

            tax += subTotal * MD_TAX;
            string = text5.getText();
            text5.setText(df.format(tax));

            realTotal += subTotal + tax;
            string = text6.getText();
            text6.setText(df.format(realTotal));

            counterp24++;
            subTotalp2 += counterp24 * 2.00;
            taxP2 += subTotalp2 * MD_TAX;
            realTotalp2 += subTotalp2 * taxP2;
        }
    }
}

If you scroll down to TempListner2 and see the variables subTotalp2, taxP2, realTotalp2; those are the variables I need to carry over. You'll see that I made the constructor have those variables in it so I can call the methods over in the third panel, but no dice. Comes up 0.0 when I open the third panel. Not sure if it is because it is in a void event or not. I'll post part of the third panel here where I am trying to call the constructor from the first panel and inset the values into the third.

Third Panel:

public AppleRegisterPanel2()
{

    AppleRegisterPanel p = new AppleRegisterPanel(subTotalp2, taxP2, 
            realTotalp2);
    this.subTotalp2 = subTotalp2;
    this.taxP2 = taxP2;
    this.realTotalp2 = realTotalp2;

    subTotalp2 = p.getSubTotal();
    taxP2 = p.getTax();
    realTotalp2 = p.getTotal();

You'll see here that I am trying a weird ass way to call the values.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

One problem is that you're opening another JFrame from a JFrame, when you should instead be displaying a modal JDialog. The reason for this is that you cannot advance your program until the user enters the appropriate information, and so the 2nd window should be modal which will prevent interaction with the underlying window until the dialog window has been completely dealt with. If you do this, and place your JPanel into a modal JDialog, then you can easily query the results from the 2nd JPanel because you will know in your code exactly when it's been dealt with -- your main GUI code resumes exactly from where you set the modal dialog visible.

For example:

import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class WindowCommunication {

   private static void createAndShowUI() {
      JFrame frame = new JFrame("WindowCommunication");
      frame.getContentPane().add(new MyFramePanel());
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   // let's be sure to start Swing on the Swing event thread
   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class MyFramePanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton openDialogeBtn = new JButton("Open Dialog");

   // here my main gui has a reference to the JDialog and to the
   // MyDialogPanel which is displayed in the JDialog
   private MyDialogPanel dialogPanel = new MyDialogPanel();
   private JDialog dialog;

   public MyFramePanel() {
      openDialogeBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            openTableAction();
         }
      });
      field.setEditable(false);
      field.setFocusable(false);

      add(field);
      add(openDialogeBtn);
   }

   private void openTableAction() {
      // lazy creation of the JDialog
      if (dialog == null) {
         Window win = SwingUtilities.getWindowAncestor(this);
         if (win != null) {
            dialog = new JDialog(win, "My Dialog",
                     ModalityType.APPLICATION_MODAL);
            dialog.getContentPane().add(dialogPanel);
            dialog.pack();
            dialog.setLocationRelativeTo(null);
         }
      }
      dialog.setVisible(true); // here the modal dialog takes over

      // this line starts *after* the modal dialog has been disposed
      // **** here's the key where I get the String from JTextField in the GUI held
      // by the JDialog and put it into this GUI's JTextField.
      field.setText(dialogPanel.getFieldText());
   }
}

class MyDialogPanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton okButton = new JButton("OK");

   public MyDialogPanel() {
      okButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            okButtonAction();
         }
      });
      add(field);
      add(okButton);
   }

   // to allow outside classes to get the text held by the JTextField
   public String getFieldText() {
      return field.getText();
   }

   // This button's action is simply to dispose of the JDialog.
   private void okButtonAction() {
      // win is here the JDialog that holds this JPanel, but it could be a JFrame or 
      // any other top-level container that is holding this JPanel
      Window win = SwingUtilities.getWindowAncestor(this);
      if (win != null) {
         win.dispose();
      }
   }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...