将输入从一个帧传递到另一个帧(JAVA)
事情是这样的 我有两个GUI程序。将输入从一个帧传递到另一个帧(JAVA),java,swing,user-interface,Java,Swing,User Interface,事情是这样的 我有两个GUI程序。 一个菜单程序,基本上是一个框架,有食物的按钮,当点击时按钮 打开另一个程序,一个输入量程序,它是一个带有文本字段、数字按钮、取消和确认按钮的框架。用户确认的数量将由菜单程序从输入数量程序中访问,并存储在向量中,因此,每当用户想要订购其他食品时,他只需单击另一个按钮并重复该过程 现在我已经编写了大部分代码,所有的东西都工作了,除了一件事,输入量程序返回的值有延迟 这是我一步一步做的: 1) 单击菜单中的食物项,将打开“输入数量”窗口。 2) 我输入了我想要的号码
一个菜单程序,基本上是一个框架,有食物的按钮,当点击时按钮 打开另一个程序,一个输入量程序,它是一个带有文本字段、数字按钮、取消和确认按钮的框架。用户确认的数量将由菜单程序从输入数量程序中访问,并存储在向量中,因此,每当用户想要订购其他食品时,他只需单击另一个按钮并重复该过程 现在我已经编写了大部分代码,所有的东西都工作了,除了一件事,输入量程序返回的值有延迟 这是我一步一步做的: 1) 单击菜单中的食物项,将打开“输入数量”窗口。
2) 我输入了我想要的号码,它正确地显示在文本框中。
3) 我按下confirm,它将做3件事,首先它将文本字段的值存储到一个变量,其次它将调用dispose()方法,第三个是显示变量值的打印语句(用于测试)。
4) 然后,菜单程序检查用户是否已按下输入程序中的确认按钮,如果为真,则应调用输入程序中名为getQuantity()的方法,该方法返回变量“quantity”的值并将其存储在向量中。
5) 之后,执行另一个print语句来检查传递的值是否正确,然后调用print()方法来显示已订购的项目名称及其记录的数量 下面是GUI的屏幕截图,下面是代码
输入数量程序中确认按钮的操作执行方法:
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的数量
在这里,我点了海鲜马里纳拉,并输入了2个
在这里,我点了最后一道菜,煎鲑鱼,并输入了3份 正如您所看到的,我订购的第一个项目的第一个记录数量为0,然后当我添加另一个项目时,第一个项目的数量被记录,但第二个项目的数量没有记录..第三个项目之后也是如此。。。即使程序终止,也不会记录第三项的数量:(
如何解决这个问题?我想我看到了你的问题,事实上,它直接源于你没有使用模式对话框来获取输入。你在用户有机会与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。假设我有两个GUI框架f1和f2。现在,通过单击f1上的按钮,我想调用框架f2,并将一些数据从f1(框架类)发送到f2(框架类)。
一种可能的方法是在f2中声明一个构造函数,它使用与我想从f1发送给它的参数相同的数据。现在在f1帧的编码中只包含以下语句:
f1.setVisible(false);//f1不可见 f2 newFrame=newf2(uname,pass);//uname和pass已从f1的文本字段中获取 f2.设置可见(真)
我认为这将解决您的问题。我不确定我们是否可以在没有代码的情况下帮助您。有多少代码?很难说,除了“足以说明问题,但不能用不相关的代码压倒我们。”最好是创建并发布一个,但这需要您付出大量的努力。如果问题很复杂,并且没有简单的解决方案,那么这通常是最好的方法。幸运的是。另外,我想知道依赖窗口是否应该是一个对话框,如JOptionPane或JDialog,而不是另一个JFrame。请理解se dialogs可以接受加载到gills上的JPanel,它有一个复杂的GUI,所以不要认为它们只是为了简单的交互,事实上远远不是。嗯……事实上……我选择将输入程序作为一个框架,这样我就可以添加按钮和文本字段。我将编辑问题并发布一些代码(我的代码很混乱,但lol)还有GUI的屏幕截图,这样你就明白了。你应该使用java.Util.List而不是Vector。@凯文:同样,你可以在对话框中添加按钮和文本字段。如果第二个窗口依赖于第一个窗口,也就是说,如果没有第一个窗口,它甚至不应该存在,那么它应该是一个对话框。我明白了。我将测试你的示例代码,以便完全理解它。谢谢你的反馈。我确信这是我问题的解决方案…但是我在实现我的GUI时遇到了问题。我使用Netbeans的GUI Builder创建了菜单界面。我将在public
MainPanel(final JFrame mainJFrame)中放置什么作为框架参数
…我的主框架类称为Test,它扩展了JFrame。我尝试输入MainPanel(new Test());
但什么都没有显示,甚至菜单界面也没有显示。我知道一些GUI的手动编码。所以我对这个例子有点了解。但没人让它工作。:)这很有帮助。再次感谢!:)我昨天真的试过了…但它把其他的事情都搞砸了。所以是的,我没有解决我的问题,无论如何谢谢。。