来自非典型的编码员,我需要一些帮助。我想在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();
}
}
答案 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并释放它的资源。
修改强>
我同意其他人的看法,你提出的问题有点不清楚,而且由于格式化,你的代码难以阅读。
其他建议:
pack()
。setVisible(true)
之前),请不要在您的顶级GUI上调用pack()
。答案 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
}
}