如何在两个JFrame间传递Meno变量?Session存储是否可行?
关于Swing中JFrame间传递变量的问题解答
嘿,别担心,新手刚接触Swing遇到这种跨窗口传值的问题太正常了!先直接给你说结论:Web开发里的Session概念在Swing桌面应用里是不适用的,所以用Session存变量的方案行不通,咱们换更适合桌面应用的方式来解决。
先看你现在的代码,直接通过login.Meno获取第一个窗口的变量,这种方式虽然能运行,但属于依赖静态变量的硬耦合设计,后续代码维护起来会很麻烦,而且容易出问题。下面给你几个更合理的方案:
方案1:通过构造函数传递参数
这是最直观也最常用的方式,在第二个JFrame的构造方法里接收Meno变量,把它存为实例变量备用:
// 第二个JFrame的类定义 public class SecondFrame extends javax.swing.JFrame { private String meno; // 存储传递过来的Meno变量 // 带参数的构造函数 public SecondFrame(String meno) { this.meno = meno; initComponents(); // 初始化组件的方法 } // 你的按钮点击事件修改后 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String Prispevok = jTextArea2.getText(); try { connection = DriverManager.getConnection(login.host + login.databaza, login.username, login.password); // 这里注意用PreparedStatement防止SQL注入! String sql = "INSERT INTO history (`Name`, `Post`) VALUES (?, ?)"; java.sql.PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, this.meno); pst.setString(2, Prispevok); pst.executeUpdate(); } catch (SQLException err) { System.out.println(err.getMessage()); } } } // 在第一个JFrame(login)里打开第二个窗口时: // SecondFrame secondFrame = new SecondFrame(Meno); // secondFrame.setVisible(true);
方案2:通过Setter方法传递参数
如果不想修改构造函数,可以给第二个JFrame加一个Setter方法来设置Meno:
public class SecondFrame extends javax.swing.JFrame { private String meno; public void setMeno(String meno) { this.meno = meno; } // 按钮事件里同样用this.meno即可 } // 调用时: // SecondFrame secondFrame = new SecondFrame(); // secondFrame.setMeno(Meno); // secondFrame.setVisible(true);
方案3:使用共享数据模型(更优雅的解耦方式)
如果后续有更多需要共享的变量,可以创建一个单独的数据类,比如UserSession,让两个JFrame都引用这个类的实例,这样数据可以在多个窗口间共享:
// 共享数据类 public class UserSession { private String meno; // 可以加其他需要共享的属性,比如用户名、权限等 public String getMeno() { return meno; } public void setMeno(String meno) { this.meno = meno; } } // 在第一个JFrame里初始化并设置值: // UserSession userSession = new UserSession(); // userSession.setMeno(Meno); // 把这个userSession传递给第二个JFrame(用构造或Setter都可以) // SecondFrame secondFrame = new SecondFrame(userSession); // secondFrame.setVisible(true); // 第二个JFrame里使用: // private UserSession userSession; // public SecondFrame(UserSession userSession) { // this.userSession = userSession; // initComponents(); // } // 按钮事件里:pst.setString(1, userSession.getMeno());
另外必须提醒你:你当前的SQL语句是直接拼接字符串的,这存在严重的SQL注入风险!一定要换成PreparedStatement来预编译SQL(我在方案1里已经给你写了示例),这样能避免恶意输入破坏你的数据库。
内容的提问来源于stack exchange,提问作者Erik Oberta
相关产品推荐
相关产品推荐

