需要帮助添加使用system.exit(0)的JButton

时间:2014-08-04 21:02:25

标签: java swing actionlistener

来自非典型的编码员,我需要一些帮助。我想在f1部分添加第二个JButton,我可以编码运行system.exit(0)以在确认密码后终止程序。除了使用单独的ActionListener编写第二个JButton之外,我得到了我需要解决的所有内容。我在Windows登录后尝试将其写为辅助授权程序,我可以从本地SQL数据库中提取密码。任何帮助将不胜感激。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class Login extends JFrame implements ActionListener {
    JLabel l1, l2, l3;
    JTextField tf1;
    JButton btn1;
    JPasswordField p1;

    Login() {
        setTitle("Company Name");
        setVisible(true);
        setSize(525, 300);
        setLayout(null);

        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        l1 = new JLabel("Enter Credentials:");
        l1.setForeground(Color.blue);
        l1.setFont(new Font("Serif", Font.BOLD, 20));

        l2 = new JLabel("Enter User Number:");
        l3 = new JLabel("Enter Password:");
        tf1 = new JTextField();
        p1 = new JPasswordField();
        btn1 = new JButton("Submit");

        l1.setBounds(100, 30, 400, 30);
        l2.setBounds(80, 70, 200, 30);
        l3.setBounds(80, 110, 200, 30);
        tf1.setBounds(300, 70, 200, 30);
        p1.setBounds(300, 110, 200, 30);
        btn1.setBounds(150, 160, 100, 30);

        add(l1);
        add(l2);
        add(tf1);
        add(l3);
        add(p1);
        add(btn1);
        btn1.addActionListener(this);

    }

    public void actionPerformed(ActionEvent e) {
        showData();
    }

    public void showData() {
        JFrame f1 = new JFrame();
        JLabel l, l0;

        String str1 = tf1.getText();
        char[] p = p1.getPassword();
        String str2 = new String(p);
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/emp?user=root&password=password");
            PreparedStatement ps = con.prepareStatement("select name from emp where id=? and password=?");
            ps.setString(1, str1);
            ps.setString(2, str2);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                f1.setVisible(true);
                f1.setSize(525, 300);
                f1.setLayout(null);

                f1.setLocationRelativeTo(null);
                l = new JLabel();
                l0 = new JLabel("you are succefully logged in..");
                l0.setForeground(Color.blue);
                l0.setFont(new Font("Serif", Font.BOLD, 30));
                l.setBounds(60, 50, 400, 30);
                l0.setBounds(60, 100, 400, 40);

                f1.add(l);
                f1.add(l0);
                l.setText("Welcome " + rs.getString(1));
                l.setForeground(Color.red);
                l.setFont(new Font("Serif", Font.BOLD, 30));

            } else {
                JOptionPane.showMessageDialog(null, "Incorrect email-Id or password..Try Again with correct detail");
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

    public static void main(String arr[]) {
        new Login();
    }
} 

3 个答案:

答案 0 :(得分:3)

我不相信你真的想这样做(虽然我可能错了)。如果这是用于登录窗口,并且使用System.exit(...)终止JVM,则整个程序将结束,包括调用此登录窗口的代码。您是否100%确定这是您想要做的?

相反,我认为您希望处理此窗口(可能应该是JDialog而不是JFrame)。像ActionListener中的代码一样可以工作:

public void actionPerformed(ActionEvent evt) {
  // get the button that was pressed
  AbstractButton src = (AbstractButton) evt.getSource();

  // get the top-level Window that holds the button
  Window window = SwingUtilities.getWindowAncestor(src);

  // dispose of this Window
  window.dispose();
}

注意,如果Window是一个JFrame,并且它的defaultCloseOperation设置为JFrame.EXIT_ON_CLOSE,那么这也会杀死JVM。如果由JDailog代替JButton,那么处理JDialog不应该杀死JVM,而只是关闭JDialog并释放它的资源。


修改
我同意其他人的看法,你提出的问题有点不清楚,而且由于格式化,你的代码难以阅读。

其他建议:

  • 避免使用null布局,因为它们导致很难管理,调试和改进GUI。
  • 而是使用自己的布局管理器嵌套组件。
  • 如果您使用布局管理器,请在添加组件后在顶级GUI上调用pack()
  • 之后添加组件时(通常在致电setVisible(true)之前),请不要在您的顶级GUI上调用pack()
  • 阅读Swing Tutorials以获取有关如何使用Swing进行编码的详细信息。

答案 1 :(得分:2)

如果我理解正确,那么问题是您正在尝试让您的Login类充当按钮的动作侦听器。

每个按钮都需要自己的actionListener,它定义了自己的actionPerformed方法。

考虑到你想做什么,你可能会因为按钮有一个匿名的actionListener,你将它添加到按钮时声明,如下所示:

btn1.addActionListener(new ActionListener() 
{
     public void actionPerformed(ActionEvent e)
     {
         System.exit(0);
     }
});

然而,正如其他人所说,杀死JVM可能不是你真正想要的。

答案 2 :(得分:0)

我想我明白你的意思,但我可能错了。你不能有2个ActionListeners。您需要做的是创建另一个JButton并向其添加相同的侦听器。

SOO:

  JButton BUTTON2 = new JButton(BUTTON2);
   BUTTON2.addActionListenter(this);

  Public void actionPerformed(ActionEvent e){

  if(e.getSource() == BUTTON2){
  System.exit(0);

  }else if(e.getSource() == BUTTON1){
    //Whatever you want in here
  }

  }