我正在制作一个调用三个面板的面板项目。面板一包含所有信息,另外两个面板是按下按钮时打开的面板。它是如何工作的我打电话给第一个面板,按一个按钮,第二个面板打开。然后在第二个面板中插入密码。如果正确,将打开第三个面板。我需要将值从第一个面板调用到第三个面板。我知道如何使用构造函数,访问器和更改器,但是当我按下按钮时,我需要的值是在事件中生成的。我试图弄清楚如何将这些值从事件调用到第三个面板。基本上,值是计划持续时间内所有交易的计数器,小计,税和总计。这是我的代码。
主类:
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();
你会在这里看到我正在尝试一种奇怪的方法来调用这些值。
答案 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();
}
}
}