在java中使用其他类中的变量从其他文件到另一个类

有两个玩家将在JTextFields中输入他们的名字。 我想要做的是,我从Enter.java中的Welcome框架输入的数据将被传输到ActualGame.java中的JLabel。

import java.awt.*; import java.awt.event.*; import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; public class Enter extends JFrame implements ActionListener { private String one = ""; private String two = ""; private JTextField txtOne = new JTextField(); private JTextField txtTwo = new JTextField(); public Enter() { this.setLayout(new FlowLayout()); setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("Welcome"); setSize(200, 130); setVisible(true); setResizable(false); setLocationRelativeTo(null); add(txtOne); add(txtTwo); enter.addActionListener(this); } public void actionPerformed(ActionEvent e) { Main main = new Main(); this.setVisible(false); one = txtOne.getText(); two = txtTwo.getText(); } } 

Main是保存ActualGame()的JFrame的主类,也是Enter()的主类。

 import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; public class Main extends JFrame { public Main() { add(new ActualGame()); setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("Main"); setSize(400, 557); setVisible(true); setResizable(false); setLocationRelativeTo(null); } public static void main(String[] args) { Enter enter=new Enter(); } } 

实际游戏:

 import java.awt.*; import javax.swing.*; public class ActualGame extends JPanel{ private JLabel lblOne = new JLabel(one);//how i wish it would be that easy private JLabel lblTwo = new JLabel(two); public ActualGame() { setLayout(new FlowLayout()); add(lblOne); add(lblTwo); } } 

我该怎么做才能使用从Enter.java到ActualGame.java的String变量一和二? 我是编程特别是java swing的新手和菜鸟。 接受批评和建议。 谢谢。

建议:

  • 将信息从一个对象传递到另一个对象与Swing和其他Java程序没有什么不同。 您可以调用方法或构造函数并在via参数中传递信息。
  • 但关键的区别在于何时传递信息。 对于事件驱动的程序,这通常由事件 ,监听器触发,因此使用观察者设计模式是注释。
  • 出于您的目的,第一个窗口可以是模式对话框,例如JOptionPane或模态JDialog,这将使得更容易确定何时传递信息。 使用模式对话框时,在对话框可见时,调用程序中的所有代码流都会暂停,然后在对话框不再可见时恢复。 一旦发生这种情况,让调用程序查询对话框很容易,因为您将准确地知道代码中的哪个位置。
  • 您需要避免在应用程序中过度显示不同的窗口,因为它很快会让用户感到烦恼。 这里和那里有一些对话框可以,特别是如果您需要以模态方式提供信息,但通常最好在需要时交换GUI“视图”,而CardLayout对此有好处。
  • 但是说到这一点,单独的视图通常由不同的类创建,因此来回传递信息的问题仍然是如上所述的类似解决方案的问题。

具体来说,给你的Enter类一个getText方法,允许其他对象查询它的JTextField的状态:

 public String getTxtOneText() { return txtOne.getText(); } 

此外,更改您的ActualGame类,以便它可以在需要时接受String信息:

 class ActualGame extends JPanel { private JLabel lblOne = new JLabel(); public ActualGame(String text) { lblOne.setText(text); setLayout(new FlowLayout()); add(lblOne); } public void setLblOneText(String text) { lblOne.setText(text); } } 

例如,

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Foo { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { ActualGame actualGame = new ActualGame(""); Main main = new Main(actualGame); main.pack(); Enter enter = new Enter(main); enter.setVisible(true); actualGame.setLblOneText(enter.getTxtOneText()); main.pack(); main.setLocationRelativeTo(null); main.setVisible(true); } }); } } class Enter extends JDialog implements ActionListener { private String one = ""; private JTextField txtOne = new JTextField(10); private JButton enter = new JButton("Enter"); public Enter(JFrame frame) { super(frame, "Welcome", true); this.setLayout(new FlowLayout()); enter.addActionListener(this); txtOne.addActionListener(this); add(txtOne); add(enter); pack(); setLocationRelativeTo(null); // this has to be done last // setVisible(true); } public String getTxtOneText() { return txtOne.getText(); } public void actionPerformed(ActionEvent e) { setVisible(false); } } class Main extends JFrame { ActualGame actualGame; public Main(ActualGame actualGame) { super("Main"); this.actualGame = actualGame; add(actualGame); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class ActualGame extends JPanel { private JLabel lblOne = new JLabel(); public ActualGame(String text) { lblOne.setText(text); setLayout(new FlowLayout()); add(lblOne); } public void setLblOneText(String text) { lblOne.setText(text); } } 

尝试将ActualGam作为Enter的底层

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import static javax.swing.JFrame.EXIT_ON_CLOSE; public class Enter extends JFrame implements ActionListener { private String one = ""; private JTextField txtOne = new JTextField(); public Enter() { this.setLayout(new FlowLayout()); setDefaultCloseOperation(EXIT_ON_CLOSE); setTitle("Welcome"); setSize(200, 130); setVisible(true); setResizable(false); setLocationRelativeTo(null); add(txtOne); enter.addActionListener(this); } public void actionPerformed(ActionEvent e) { Main main = new Main(); this.setVisible(false); one = txtOne.getText(); } class ActualGame extends JPanel{ private JLabel lblOne = new JLabel(one); public ActualGame() { setLayout(new FlowLayout()); Enter.this.add(lblOne); } } }