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

时间:2013-12-08 14:13:08

标签: java swing jpanel jlabel

有两名玩家将在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();
    }
}

ActualGame:

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的新手和菜鸟。接受批评和建议。谢谢。

2 个答案:

答案 0 :(得分:3)

建议:

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

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

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

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

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);
   }
}

答案 1 :(得分:0)

尝试将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);
   }
}
}