有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

存储在会话中的java变量?/在JFrames之间传递变量

我有两个Jframe,如何将变量Meno从第一个Jframe传递到第二个Jframe。 我正在考虑将其存储在会话中,但不知道是否有效

第二帧上的代码如下所示

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String Meno = login.Meno; 
    String Prispevok = jTextArea2.getText();

    try {
        connection = DriverManager.getConnection(login.host + login.databaza, login.username, login.password);
        java.sql.Statement st = connection.createStatement(); 
        st.executeUpdate("INSERT INTO history (`Name`, `Post`) " + "VALUES ('"+Meno+"' , '"+Prispevok+"')");
    } catch (SQLException err) {
        System.out.println(err.getMessage());
    }      
}                                        

如果我问错了,我很抱歉,但我是新来的。谢谢朋友们:)


共 (3) 个答案

  1. # 1 楼答案

    这条线

    String Meno = login.Meno; 
    

    让我觉得你有点

    class Login {
        public String Meno;
    }
    

    把你的框架说成

    class MyFrame {
        private Login login;
    }
    

    您想要的是让Login类成为应用程序的模型,它将分发更改。这意味着您没有public成员,而是一个getter/setter方法

    class Login {
        private String meno;
        public void setMeno(String n) { this.meno = n; }
        public String getMeno() { return meno; }
    }
    

    如果要显示该名称,可以执行以下操作:

    JTextField field = new JTextField(login.getMeno());
    

    然后,因为名称可能会更改,所以需要一种机制来更新GUI组件。这可以使用侦听器模式完成:

    interface NameListener {
        public void nameChanged(String newName);
    }
    
    class Login {
        private String meno;
        private Collection<NameListener> listeners = new ArrayList<>();
        public void addListener(NameListener l) { listeners.add(l); }
        public void setMeno(String n) {
            meno = n;
            for (NameListener l : listeners) { l.nameChanged(n); }
        }
    }
    

    要在文本字段中启用更新,可以执行以下操作:

    JTextField field = new JTextField(login.getMeno());
    login.addListener(n -> field.setText(n));
    

    因为您只有一个Login实例(您应该使用单例模式),所以另一个帧可以像这样注册为侦听器。下面是如何声明singleton Login类:

    class Login {
        private static final Login INSTANCE;
        private Login() {}
        public Login getInstance() {
            if (INSTANCE == null) { INSTANCE = new Login(); }
            return INSTANCE;
        }
    
        private String meno;
        // ...
    }
    

    然后,您可以在JFrame中使用它,如下所示:

    class MyFrame {
        Login login = Login.getInstance();
        // ...
    }
    
  2. # 2 楼答案

    您可以创建一个自定义类(扩展JFrame),其中可以有public void setMeno(String meno)public String getMeno()等方法(如果需要),以便将变量传递给JFrame。我不确定这是否是你的意思,因为你没有给出很多细节

    基本示例:

    public class JFrame2 extends JFrame{
      private String meno;
    
      public void setMeno(String meno)
      {
        this.meno = meno;
      }
    }
    

    如果您有这样一个类,那么可以通过对所创建的对象(JFrame2的实例)调用setMeno(meno),轻松地在第二个JFrame中设置meno

  3. # 3 楼答案

    解决方案1: 创建一个类名,将其命名为常量,并存储字符串meno。然后随时随地使用

    public Class Constant{
        public static String meno="";
    }
    

    然后在JFrame1中将该值设置为meno,如

    Constant.meno="SomeValue";
    

    然后从JFrame 2中的常数中检索值

    String meno=Constant.meno;
    

    解决方案2: 在构造函数中传递值meno,如

    Frame2 frame=new Frame2(Meno);
    

    并检索JFrame2中的meno值,如

    String meno;
    public Frame2(String _meno){
        meno=_meno;
    }
    

    希望这将帮助你,如果你需要进一步的帮助,请在下面发表评论