我想在登录窗口的用户名中输入数据时登录按钮为启用状态,用户名中无数据时登录按钮为未启用状态,我说的不是在用户名中输入数据为按回车才后登录才为启用状态,是在用户名中输入数据时为启用状态各位大神千万别因为结帖率的问题就不指点啊 ,我的帖子就两个没有结帖,一个是昨天发的,还有一个就是现在这个啊 代码如下:/**
 * @(#)Login.java
 *
 *
 * @author 
 * @version 1.00 2012/3/17
 */
 
 import java.awt.*;
 import javax.swing.*;
 import java.awt.event.*;
 import java.sql.*;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
  
 class FrameTest extends JFrame {
  public FrameTest() {
  super("请登录");
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setVisible(true);
  setSize(320, 240);
 
  }
 
 }
 
 class PanelTest extends FrameTest {
  JPanel panelObj;
  public PanelTest() {
  panelObj = new JPanel();
  getContentPane().add(panelObj);
 
  }
 
 }
 
 class ComponentTest extends PanelTest {
  JLabel loginName;
  JLabel loginPassword;
  JTextField textName;
  JPasswordField textPassword;
  JButton buttonLogin;
  JButton buttonReset;
 
  public ComponentTest() {
  loginName     = new JLabel("用户名:");
  loginPassword = new JLabel("密码:");
  buttonLogin   = new JButton("登录");
  buttonReset   = new JButton("重置");
  textName      = new JTextField(10);
  textPassword  = new JPasswordField(10);
 
  panelObj.add(loginName);
  panelObj.add(textName);
  panelObj.add(loginPassword);
  panelObj.add(textPassword);
  panelObj.add(buttonLogin);
  panelObj.add(buttonReset);
   
  }
 
 }
 
 public class Login extends ComponentTest {
  GridBagLayout gbLayoutObj; 
    GridBagConstraints gbcObj;
    boolean b = false;
    
    public Login() {
    
     gbLayoutObj   = new GridBagLayout();
     gbcObj        = new GridBagConstraints();
     panelObj.setLayout(gbLayoutObj);
    
     gbcObj.anchor = GridBagConstraints.EAST;
     gbcObj.gridx  = 1;
     gbcObj.gridy  = 1;
     gbLayoutObj.setConstraints(loginName,gbcObj);
     gbcObj.gridy  = 2;
     gbLayoutObj.setConstraints(loginPassword,gbcObj);
    
     gbcObj.anchor = GridBagConstraints.WEST;
     gbcObj.gridx  = 2;
     gbcObj.gridy  = 1;
     gbLayoutObj.setConstraints(textName,gbcObj);
     gbcObj.gridy  = 2;
     gbLayoutObj.setConstraints(textPassword,gbcObj);
    
     gbcObj.anchor = GridBagConstraints.SOUTH;
     gbcObj.gridx  = 1;
     gbcObj.gridy  = 3;
     gbLayoutObj.setConstraints(buttonLogin,gbcObj);
     gbcObj.gridx  = 2;
     gbLayoutObj.setConstraints(buttonReset,gbcObj);
    
     buttonLogin.setEnabled(true);
    
     buttonReset.addActionListener (
  new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  Login.this.Reset();
  }
  }
  );
 
  //textName.addActionListener(this);
 
  buttonLogin.addActionListener (
  new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  Login.this.f();
  }
  }
  );
 
    }
    
    protected void Reset() {
     textName.setText("");
     textPassword.setText("");
    }
    
   /* public void keyPressed(KeyEvent e) {
     buttonLogin.setEnabled(true);
    }
    
    public void keyReleased(KeyEvent e) {
    
    }
    
    public void keyTyped(KeyEvent e) {
    
    }*/
    
    protected boolean f() {
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=J://course/AddressBook/Test/DataBase/Login.mdb";

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(url);
Statement st = con.createStatement();
String name = textName.getText().trim();
String pwd = textPassword.getText().trim();
ResultSet rs = st.executeQuery("select * from LoginMessage where ID = '" +
 name + "'");
if(rs.next()) {
rs.close();
rs = st.executeQuery("select * from LoginMessage where ID = '" +
name + "' and Pwd = '" + pwd + "'");
if(rs.next()) {
JOptionPane.showMessageDialog(new JPanel(), "恭喜!!!登录成功");
setVisible(false);
TestFrame frame = new TestFrame();
    
        // Show frame.
        frame.show(true);
}
else {
JOptionPane.showMessageDialog(new JPanel(), "密码输入错误!请确认后再次输入");
}
}
else {
JOptionPane.showMessageDialog(new JPanel(), "用户名不存在");
}
}
catch(Exception ex) {
ex.printStackTrace();
}

return b; }


 }/*class LoginData {
public boolean f () {
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=J://course/AddressBook/Test/DataBase/Login.mdb";
boolean bz = false;

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(url);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from LoginMessage where ID = " +
 textName.getText() + "and Pwd = " + textPassword.getText());
while(rs.next()) {
bz = true;
rs.close();
st.close();
con.close();
}
}
catch(Exception ex) {
ex.printStackTrace();
}

return bz;
}
}*/

解决方案 »

  1.   

    如果想控制输入,就给JTextField add KeyListener() 
    但,你意思你想只要有输入就调用f()方法?那输入1 ,就开始执行f()?不应该这样吧。用户名都没写完不是。
      

  2.   

    为loginName = new JLabel("用户名:");这个lable写一个监听事件。
    如果它的值改变且不为空,则让登陆按钮可用,否则不可用。
      

  3.   

    不是这样的,我的意思是当用户名中有数据输入时登录(buttonLogin)按钮的状态为true,上面是我为也验证数据库链接而改的,
      

  4.   

    貌似你们都理解错了,我的意思是说
    当 用户名 后面的文本框中有数据输入时,登录 按钮的状态为true,否则为false
      

  5.   

    那你就给“用户名 后面的文本框”添加一个Listener吧。当Listener监听到时判断当前文件框的值为空字符串不,如果是,则disable登陆按钮;否则able登陆按钮。
      

  6.   

    final JTextField text_name = new JTextField();
    final JButton btn_login = new JButton();
    text_name.addCaretListener(new CaretListener() { @Override
    public void caretUpdate(CaretEvent e) {
    btn_login.setEnabled(!text_name.getText().trim().equals(""));
    } });
      

  7.   

    可以为文本框添加鼠标事件或者键盘事件,鼠标进入或者按下键盘时按钮设为true,此时为可用状态
    ”用户名中无数据时登录按钮为未启用状态“个人觉得这个要求是不需要的
    如果用户在输入过程中清除数据重新输入,而登陆按钮频繁在启用与不启用之间切换
    这样可能是不太必要的。
      

  8.   

    回复5楼:你的那个方法我试过,运行出来,在用户名后面的文本框中输入内容后登录按钮的状态不会直接变为true,需要按下回车键才可以。回复6楼:我写了上去问题搞定,正是我想要的那种结果,谢谢了。回复7楼:这个是老师要求的,也好让我学习一下吧,呵呵 。至于鼠标或键盘事件我还不太会,能指点一下吗?我的QQ是373239838,希望各位能加了指点一下,呵呵 ,谢谢了