Java - GUI:将值从帧传递到另一个

时间:2014-05-10 14:48:45

标签: java user-interface

我正在制作一个调用三个面板的面板项目。面板一包含所有信息,另外两个面板是按下按钮时打开的面板。它是如何工作的我打电话给第一个面板,按一个按钮,第二个面板打开。然后在第二个面板中插入密码。如果正确,将打开第三个面板。我需要将值从第一个面板调用到第三个面板。我知道如何使用构造函数,访问器和更改器,但是当我按下按钮时,我需要的值是在事件中生成的。我试图弄清楚如何将这些值从事件调用到第三个面板。基本上,值是计划持续时间内所有交易的计数器,小计,税和总计。这是我的代码。

主类:

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

第一小组:

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

如果向下滚动到TempListner2并查看变量subTotalp2,taxP2,realTotalp2;这些是我需要继承的变量。您将看到我使构造函数中包含这些变量,因此我可以在第三个面板中调用这些方法,但没有骰子。当我打开第三个面板时出现0.0。不确定是否因为它处于无效事件中。我将在这里发布第三个面板的一部分,我试图从第一个面板调用构造函数并将值插入第三个面板。

第三小组:

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

你会在这里看到我正在尝试一种奇怪的方法来调用这些值。

1 个答案:

答案 0 :(得分:2)

一个问题是,您应该从JFrame中打开另一个JFrame,而应该显示模态JDialog 。这样做的原因是,在用户输入适当的信息之前,您无法推进您的程序,因此第二个窗口应该是模态的,这将阻止与底层窗口的交互,直到对话窗口被完全处理完毕。如果你这样做,并将你的JPanel放到一个模态JDialog中,那么你可以轻松查询第二个JPanel的结果,因为你将在你的代码中准确地知道它已被处理 - 你的主GUI代码完全恢复从您设置模态对话框的位置。

例如:

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