这就是......
我有2个GUI程序 一个菜单程序,它基本上是一个包含食物项按钮的框架,点击时按钮 打开另一个程序,一个输入数量程序,它是一个带有文本字段的框架,数字按钮,取消和确认按钮。菜单程序将从输入数量程序访问用户确认的数量,以存储在矢量中,这样每次用户想要订购其他食品时,他只需点击另一个按钮并重复该过程。 / p>
现在我编写了大部分内容并且除了一件事之外一切都正常工作,输入数量计划返回的值有这个延迟的事情。
这就是我一步一步做的事情:
1)单击菜单中的食物项目,打开输入数量窗口
2)我输入了我想要的数字,它正确地显示在文本框中
3)我按下确认哪个会做3件事,首先它将文本字段的值存储到变量中,第二个将调用dispose()方法,第三个是显示变量值的print语句(用于测试目的)。
4)菜单程序然后检查用户是否已经按下Input程序中的Confirm按钮,如果为true,它将调用Input程序中名为getQuantity()的方法,该方法返回变量'quantity'的值并将其存储在矢量。
5)之后执行另一个print语句以检查传递的值是否正确,然后调用方法print()以显示已订购的项目名称及其记录的数量。
以下是GUI的屏幕截图,代码将在其下方。
输入数量计划中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
在这里,我订购了海鲜marinara并输入了2的数量
在这里,我订购了最后一个项目,煎三文鱼,并输入了数量3
正如您所看到的,我订购的第一个项目的第一个记录数量是0,然后当我添加另一个项目时,第一个项目的数量被记录但第二个项目的数量没有被记录。相同于第三个项目之后......即使程序终止,也不会记录第3项的数量:(
我该如何解决这个问题?
答案 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(真);
我认为这会解决你的问题。