我正在编写一个程序,其中包含一个带有JMenu的JFrame。一旦用户单击menuItem,就会调用JDialog以从用户获取String。我想在我的主程序中使用该字符串,但我不知道如何将该值从JFrame返回到主程序(我设法将值从JDialog返回到JFrame)。有什么想法吗?
我的主要内容::
public static void main(String[] args)
{
myFirstFrame m = new myFirstFrame();
m.setVisible(true);
String localhost = m.getLh();
System.out.println(localhost);
}
我的JFrame ::
public class myFirstFrame extends JFrame
{
String lh;
myDialog myD;
public myFirstFrame(JFrame mf)
{
super();
setTitle("Welcome");
setSize(300, 300);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JMenuItem playg = new JMenuItem("Play game");
simetoxi.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
myD = new myDialog(myFirstFrame.this);
myD.setVisible(true);
String lh = myD.getText();
System.out.println(lh + "ASasASas");
dispose();
}
});
JMenu game = new JMenu("GAME");
game.add(playg);
JMenuBar myBar = new JMenuBar();
myBar.add(game);
setJMenuBar(myBar);
}
public String getLh()
{
return lh;
}
}
我的JDialog ::
public class myDialog extends JDialog
{
JTextField t1;
String sname;
public myDialog(JFrame fr)
{
super(fr, true);
setTitle("Connect");
setSize(200, 200);
setLayout(new FlowLayout());
JLabel l1 = new JLabel("Give the server name");
t1 = new JTextField(15);
add(l1);
add(t1);
JButton okb = new JButton("submit");
okb.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
sname = t1.getText();
dispose();
}
});
add(okb);
}
public String getText()
{
return sname;
}
}
答案 0 :(得分:2)
问题是当main
创建Frame
时,它不会停止并等待值在执行main
函数的其余部分之前变为可用。
有很多方法可以解决这个问题。例如,您可以将其放在不同的方法中,而不是将System.out.println(localhost)
放在main
中。然后,在Frame
中,在获得值时调用该方法。
如果你真的想把这个电话放在main
中,你必须找到一些方法让main
阻止,直到价值可用。例如,您可以创建BlockingQueue
,并尝试从main
中取值。在Frame
事件处理程序中,将所需的值推送到队列中。
答案 1 :(得分:0)
主要方法不会等待你的JFrame完成这些步骤,所以在主程序中调用getter(即使你"更正"
String lh = myD.getText();
到
lh == myD.getText();
不起作用。 - 将此信息传递给充分利用它的类/方法,也许在单独的线程中处理它 - 取决于你想要做什么" localhost"。