Java 用变量连接JFrames
我有一个用于登录表单的程序。我试图在actionListener方法中使用本地的用户变量,以便在用户回答问题时在mysql数据库中使用它。基本上,我有一个类,用户登录,然后转到另一个表单,点击开始测试,然后转到我想要使用用户变量的表单。为了获得用户名,我使用了getter和setter方法,然后在JFrame中使用它,用户回答问题。在这个类中打印消息时,它返回用户变量。但是当我想在另一个JFrame中使用它时,它返回null!有什么想法,我怎么做Java 用变量连接JFrames,java,mysql,swing,Java,Mysql,Swing,我有一个用于登录表单的程序。我试图在actionListener方法中使用本地的用户变量,以便在用户回答问题时在mysql数据库中使用它。基本上,我有一个类,用户登录,然后转到另一个表单,点击开始测试,然后转到我想要使用用户变量的表单。为了获得用户名,我使用了getter和setter方法,然后在JFrame中使用它,用户回答问题。在这个类中打印消息时,它返回用户变量。但是当我想在另一个JFrame中使用它时,它返回null!有什么想法,我怎么做 import java.awt.EventQue
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JPasswordField;
public class Build1 extends JFrame {
private JPanel contentPane;
private JTextField textField;
private JPasswordField passwordField;
private String user;
JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Build1 frame = new Build1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Build1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 500, 500);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textField = new JTextField();
textField.setBounds(96, 58, 86, 20);
contentPane.add(textField);
textField.setColumns(10);
JLabel lblUsername = new JLabel("Username");
lblUsername.setBounds(10, 61, 59, 14);
contentPane.add(lblUsername);
JLabel lblPassword = new JLabel("Password");
lblPassword.setBounds(10, 113, 59, 14);
contentPane.add(lblPassword);
JButton btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
try{
String user = textField.getText().trim();
String pass = String.valueOf(passwordField.getPassword());
setUsername(user);
getUsername();
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/users","root","1234");
PreparedStatement st = con.prepareStatement("select * from user where username='"+user+"'");
ResultSet rs = st.executeQuery();
if(rs.next())
{
String dbpass = rs.getString(4);
if(dbpass.equals(pass)){
if(user.equals("Admin")){
Build5 Admin = new Build5();
Admin.setVisible(true);
Build1.this.dispose();
Build1.this.setVisible(false);
}
else{
JOptionPane.showMessageDialog(frame," "+user);
Build2 User = new Build2();
User.setVisible(true);
Build1.this.dispose();
Build1.this.setVisible(false);
}
}
else
{
JOptionPane.showMessageDialog(null,"Login Unsuccessful!","Error",1);
}
}
else
{
JOptionPane.showMessageDialog(null,"Username not found","Error",1);
}
} catch (SQLException ex) {
System.out.println(ex);
}
}
});
btnLogin.setBounds(186, 202, 89, 23);
contentPane.add(btnLogin);
JButton btnRegister = new JButton("Register");
btnRegister.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
Build3 frame = new Build3();
frame.setVisible(true);
Build1.this.dispose();
Build1.this.setVisible(false);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
btnRegister.setBounds(186, 236, 89, 23);
contentPane.add(btnRegister);
JButton btnRecoverPassword = new JButton("Recover Password");
btnRecoverPassword.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
Build4 frame = new Build4();
frame.setVisible(true);
Build1.this.dispose();
Build1.this.setVisible(false);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
btnRecoverPassword.setBounds(153, 270, 147, 23);
contentPane.add(btnRecoverPassword);
passwordField = new JPasswordField();
passwordField.setBounds(96, 110, 86, 20);
contentPane.add(passwordField);
}
public void setUsername(String user){
this.user = this.textField.getText();
}
public String getUsername() {
JOptionPane.showMessageDialog(frame,"1 "+user);
return user;
}
}
另一类:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
public class Build6 extends JFrame {
private JPanel contentPane;
JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Build6 frame1 = new Build6();
frame1.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Build6() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 500, 500);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
final JRadioButton rdbtnTrue = new JRadioButton("True");
rdbtnTrue.setBounds(162, 132, 109, 23);
contentPane.add(rdbtnTrue);
final JRadioButton rdbtnFalse = new JRadioButton("False");
rdbtnFalse.setBounds(162, 158, 109, 23);
contentPane.add(rdbtnFalse);
final JRadioButton rdbtnDontKnow = new JRadioButton("Don't know");
rdbtnDontKnow.setBounds(162, 184, 109, 23);
contentPane.add(rdbtnDontKnow);
final JRadioButton rdbtnWhatever = new JRadioButton("Whatever");
rdbtnWhatever.setBounds(162, 210, 109, 23);
contentPane.add(rdbtnWhatever);
JLabel lblDoesAMan = new JLabel("Does a man fly?");
lblDoesAMan.setBounds(162, 97, 109, 14);
contentPane.add(lblDoesAMan);
JButton btnAnswer = new JButton("Answer");
btnAnswer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
Build1 a = new Build1();
String user = a.getUsername();
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/answers","root","1234");
Connection con1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/users","root","1234");
PreparedStatement st = con1.prepareStatement("select * from user where username='"+user+"'");
ResultSet rs = st.executeQuery();
while(rs.next()){
String username = rs.getString("username");
if(user.equals(username)){
JOptionPane.showMessageDialog(frame,"DAN DAN!"+user+" "+username);
}
}
if(rdbtnDontKnow.isSelected()){
java.util.Date dt = new java.util.Date();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.text.SimpleDateFormat sdf1 = new java.text.SimpleDateFormat("yyyy-MM-dd");
String currentday = sdf1.format(dt);
String currentdayTime = sdf.format(dt);
String answer = "Wrong";
String test ="test1";
PreparedStatement st11 = (PreparedStatement) con.prepareStatement("INSERT INTO answer (username,daytime,answer,test,day) VALUES (?,?,?,?,?)");
st11.setString(1, user);
st11.setString(2, currentdayTime);
st11.setString(3, answer);
st11.setString(4, test);
st11.setString(5, currentday);
st11.executeUpdate();
st11.close();
}
else if(rdbtnWhatever.isSelected()){
java.util.Date dt = new java.util.Date();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.text.SimpleDateFormat sdf1 = new java.text.SimpleDateFormat("yyyy-MM-dd");
String currentdayTime = sdf.format(dt);
String currentday = sdf1.format(dt);
String answer = "Wrong";
String test ="test1";
PreparedStatement st11 = (PreparedStatement) con.prepareStatement("INSERT INTO answer (username,daytime,answer,test,day) VALUES (?,?,?,?,?)");
st11.setString(1, user);
st11.setString(2, currentdayTime);
st11.setString(3, answer);
st11.setString(4, test);
st11.setString(5, currentday);
st11.executeUpdate();
st11.close();
}
else if(rdbtnTrue.isSelected()){
java.util.Date dt = new java.util.Date();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.text.SimpleDateFormat sdf1 = new java.text.SimpleDateFormat("yyyy-MM-dd");
String currentday = sdf1.format(dt);
String currentdayTime = sdf.format(dt);
String answer = "Wrong";
String test ="test1";
PreparedStatement st11 = (PreparedStatement) con.prepareStatement("INSERT INTO answer (username,daytime,answer,test,day) VALUES (?,?,?,?,?)");
st11.setString(1, user);
st11.setString(2, currentdayTime);
st11.setString(3, answer);
st11.setString(4, test);
st11.setString(5, currentday);
st11.executeUpdate();
st11.close();
}
else if(rdbtnFalse.isSelected()){
java.util.Date dt = new java.util.Date();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.text.SimpleDateFormat sdf1 = new java.text.SimpleDateFormat("yyyy-MM-dd");
String currentday = sdf1.format(dt);
String currentdayTime = sdf.format(dt);
String answer = "Wrong";
String test ="test1";
PreparedStatement st11 = (PreparedStatement) con.prepareStatement("INSERT INTO answer (username,daytime,answer,test,day) VALUES (?,?,?,?,?)");
st11.setString(1, user);
st11.setString(2, currentdayTime);
st11.setString(3, answer);
st11.setString(4, test);
st11.setString(5, currentday);
st11.executeUpdate();
st11.close();
}else{
JOptionPane.showMessageDialog(frame,"Select an answer!");
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
btnAnswer.setBounds(192, 261, 89, 23);
contentPane.add(btnAnswer);
ButtonGroup group = new ButtonGroup(); //Σε περίπτωση που θέλουμε να διαλέγει μόνο ένα!
group.add(rdbtnTrue);
group.add(rdbtnFalse);
group.add(rdbtnDontKnow);
group.add(rdbtnWhatever);
}
}
编辑(20/1):新的登录表单(用户变量所在的sql部分)
建议:
- 您的登录窗口不应该是JFrame,而应该是一个模式对话框,如JOptionPane或模式JDialog。这样,当调用代码显示对话框时,调用代码中的所有代码流都将停止,并保持停止状态,直到对话框不再可见李>
- 一旦对话框不再可见且调用代码恢复,则可以查询对话框类的状态并获取登录信息
- 您没有向我们展示(或者我没有看到)如何尝试从其他地方调用此代码。这是关键,因为这是您的问题所在,也是我们必须看到的
- 正如kleopatra所说,不要使用空布局和组件的直接定位和大小调整,因为它会回来咬你的牙,相信我
编辑 是的,我相信你的问题正如我预测的那样,是因为你使用JFrame作为对话框窗口。看这里:
Build1 a = new Build1();
String user = a.getUsername();
由于Build1是一个非模态JFrame,当它被设置为可见时,它不会阻止调用代码。因此,在用户有机会将数据输入Build1窗口之前,会立即调用a.getUsername()
一种解决方案是使用WindowListener查看Build1窗口何时不再可见,但为什么要经历这种混乱呢。相反,为什么不简单地在对话框窗口中使用模式JDialog而不是JFrame呢
同样,你会希望停止使用空布局和绝对定位,相信我。它会咬你的
编辑2
你说:
首先,你能给我举一个JDialog的例子吗 创建和使用JDialog与创建JFrame类似,只是您应该在构造函数中传入对父窗口的引用,并告诉它是否为模态窗口。请查看JDialog API以了解其构造函数的详细信息。另外,我已经在这个网站上写了很多使用这个的例子,我邀请你用我的名字和术语JDialog搜索这个网站,你会发现我写的很多例子。此外,我建议您将大部分GUI创建工作都放在创建JPanel上,然后您可以轻松地将这些JPanel放在需要的地方:一个JFrame、一个模态JDialog、一个JOptionPane、另一个JPanel,。。。等等。它给了你的GUI很大的灵活性 第二个空布局您的意思是:contentPane.setLayout(空) 对 为什么我必须停止使用它们?我的代码会有问题吗 您的GUI将非常“僵硬”,虽然它在您的系统上看起来不错,但在其他平台上,甚至在具有不同屏幕分辨率的类似平台上,可能都不好看。不仅如此,您的GUI将很难更改、更新或改进。例如,请在我的StackOverflow答案中查看我的代码。代码创建了一个JPanel,它使用GridBagLayout显示JLabel和JTextFields的网格,并显示如下: 在该代码中,我使用一个简单的字符串数组指定JLabel:
String[] labelTexts = new String[] { "Width of Frame:",
"Height of Frame:", "# OF Balls:", "Color:" };
正如我在回答中所说的,这段代码的美妙之处在于,如果您希望添加另一个字段,比如一个线宽字段,并希望将其添加到倒数第二位,那么代码所需的唯一更改就是更改以下内容:
String[] labelTexts = new String[] { "Width of Frame:",
"Height of Frame:", "# OF Balls:", "Color:" };
为此:
String[] labelTexts = new String[] { "Width of Frame:",
"Height of Frame:", "# OF Balls:", "Line Thickness:", "Color:" };
其结果是:
这是唯一可能的,因为我使用布局管理器来帮助我生成GUI。如果手动执行此操作,则必须定位新组件,但也必须手动将所有组件重新定位到添加的任何新组件的右侧和下方。如果您对GUI进行重大更改,这可能会很麻烦,而且很容易出错。这里的布局管理员将为您完成所有繁重的工作
另外请注意,这段代码是使用GUI创建JPanel的一个示例,我将其显示在JOptionPane中,这是一种模式对话框的形式,事实上,这对您来说可以很好地工作。无关:永远不要手动调整/定位组件-这是LayoutManager的专属责任。首先,你能给我举个JDialog的例子吗?第二个空布局您的意思是:contentPane.setLayout(空)?为什么我必须停止使用它们?我的代码会有问题吗?是的,我在这里!我正试着照你说的做,但是我用JDialog给自己惹了很多麻烦。现在我正在尝试使用JOptionPane,但是我找不到一种方法来放置JButton,并且没有默认选项,例如Y/N、Y/N/C等@pap:那么最好使用JDialog。同样,将注意力集中在创建jpanel上,不要扩展JFrame或JDialog。然后,当需要该对话框时,在vivo中创建它,将您的JPanel添加到它的contentPane中,然后启动它。它是什么意思“在vivo中创建它”?好的,我会坚持这个(JPanel)并按照你说的那样构建它,没有绝对定位。这是一个科学术语。“活体内”是指“活体内”,而不是皮氏培养皿中的“体外”。我的意思是在程序只在需要时运行时创建JDialog。
String[] labelTexts = new String[] { "Width of Frame:",
"Height of Frame:", "# OF Balls:", "Line Thickness:", "Color:" };