【问题标题】:Connecting JFrames with a variable用变量连接 JFrame
【发布时间】:2014-01-19 15:14:56
【问题描述】:

我有一个用于登录表单的程序。我试图在 actionListener 方法中获取本地用户变量,以便在用户回答问题时在 mysql 数据库中使用它。所以基本上我有这个类,用户进行登录,然后转到另一个表单以单击开始测试,然后转到我想使用用户变量的表单。我已经完成了 getter 和 setter 方法以获得用户名,然后在用户回答问题的 JFrame 中使用它。当我在这个类中打印一条消息时,它会返回用户变量。但是当我想在另一个 JFrame 中使用它时,它返回 null!有什么想法,我该怎么做?

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

    }
}

Edit(20/1):新的登录表单(用户变量所在的sql部分)

      JButton lgnBtn = new JButton("Login");
      lgnBtn.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e)
            {
                try{
                String user = t.getText().trim();


                String pass = String.valueOf(t1.getPassword());

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

                            JOptionPane.showMessageDialog(frame," "+user);
                            Build2 User = new Build2();
                            User.setVisible(true);
                        }
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,"Login Unsuccessful!","Error",1);
                    }

                }
                else
                {
                    JOptionPane.showMessageDialog(null,"Username not found","Error",1);
                }

            } catch (SQLException ex) {
                System.out.println(ex);
            }

        }
    });

【问题讨论】:

  • 不相关:永远不要手动调整组件大小/定位 - 这是 LayoutManager 的专属职责。

标签: java mysql swing


【解决方案1】:

建议:

  • 您的登录窗口不应是 JFrame,而应是模态对话框,例如 JOptionPane 或模态 JDialog。这样,当您的调用代码显示对话框时,调用代码中的所有代码流都会停止,并保持暂停状态,直到对话框不再可见。
  • 一旦对话框不再可见并且调用代码恢复,此时您可以查询对话框类的状态并获取登录信息。
  • 您没有向我们展示(或者我没有看到)您如何尝试从其他地方调用此代码。这是关键,因为这是您的问题所在,也是我们必须看到的。
  • 正如 kleopatra 所说,不要使用 null 布局以及直接定位和调整组件大小,因为它会回来咬你,相信我。

编辑

是的,我相信您的问题正如我所预测的那样,是因为您使用 JFrame 作为对话窗口。看这里:

Build1 a = new Build1();  
String user = a.getUsername();

由于Build1是一个非模态的JFrame,所以设置为可见时不会阻塞调用代码。因此a.getUsername() 在用户有机会在 Build1 窗口中输入数据之前立即被调用。

一种解决方案是使用 WindowListener 来查看 Build1 窗口何时不再可见,但为什么要经历这种混乱。相反,为什么不简单地为您的对话窗口使用 modal JDialog 而不是 JFrame。


再一次,你会想要停止使用空布局和绝对定位,相信我。它会咬你。


编辑 2
你说:

首先,你能给我举个 JDialog 的例子吗?

创建和使用 JDialog 与创建 JFrame 类似,不同之处在于您应该在构造函数中传入对父窗口的引用,并告诉它是否是模态的。请查看 JDialog API 以了解其构造函数的详细信息。另外,我在这个网站上写了很多使用这个的例子,我邀请你用我的名字和术语 JDialog 搜索这个网站,你会发现很多我写的例子。另外,我建议您将大部分 GUI 创作用于创建 JPanel,然后您可以轻松地将这些 JPanel 放置在需要的地方:JFrame、模态 JDialog、JOptionPane、另一个 JPanel 等。它为您提供GUI 具有很大的灵活性。

你的意思是第二个空布局: contentPane.setLayout(null); ?

是的。

为什么我必须停止使用它们?我的代码会有问题吗?

您的 GUI 将非常“僵化”,虽然它在您的系统上可能看起来不错,但在其他平台甚至类似平台上可能看起来不太好,但屏幕分辨率不同。不仅您的 GUI 很难更改、更新或改进。例如,请查看我的 StackOverflow 答案 here 中的代码。该代码创建了一个 JPanel,它使用 GridBagLayout 显示 JLabels 和 JTextField 的网格,并显示如下:

在该代码中,我用一个简单的字符串数组指定 JLabels:

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 中显示该 JPanel,这是一种模式对话框的形式,实际上这对您很有效。

【讨论】:

  • 首先,你能给我举个JDialog的例子吗?你的意思是第二个空布局: contentPane.setLayout(null); ?为什么我必须停止使用它们?我的代码会有问题吗?
  • 是的,我在这里!我正在尝试按照您所说的去做,但是我在使用 JDialog 时遇到了很多麻烦。现在我正在尝试使用 JOptionPane,但我找不到放置 JButton 的方法并且没有默认选项,例如 Y/N、Y/N/C 等。
  • @pap:那么最好走 JDialog 的路线。再次,将注意力集中在创建 JPanel 上,不要扩展 JFrame 或 JDialog。然后当需要对话框时,在 vivo 中创建它,将您的 JPanel 添加到它的 contentPane 中,然后启动它。
  • “在体内创造”是什么意思?好的,我会坚持下去(JPanel)并按照你说的构建它,没有绝对定位。
  • 这是一个科学术语。 “体内”是指“在生活中”,而不是在培养皿中的“体外”。我的意思是仅在需要时在程序运行时创建 JDialog。
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多