2012-12-05 71 views
1

我正在使用Java Swing開發我的第一個GUI程序。我有一個登錄表單類,它讀入用戶名和密碼,然後檢查本地數據庫中是否有匹配的用戶名/密碼組合。如果有,我希望能夠將JFrame對象的用戶名返回到我的主類。這隻會發生在我點擊我的登錄按鈕的動作之後。發佈操作後從JFrame返回

我不知道如何使這一類特定時間後返回:

public class Login extends JFrame { 

//declaration of components 
private JTextField userText = new JTextField(12); 
private JPasswordField passText = new JPasswordField(12); 

//declaration of variables 
String username; 
String password; 
//... 
class loginAction extends AbstractAction{ 
    loginAction(){ 
     super("Login"); 
     putValue(SHORT_DESCRIPTION, "Click to login"); 
    } 
    public void actionPerformed(ActionEvent e){ 
     userLogin(); 
    } 
} 

public String userLogin(){ 
    String sql = "SELECT * from Employees " + 
       "WHERE Username = ? AND Password = ?"; 

    try(PreparedStatement ps = con.prepareStatement(sql)){ 
     ps.setString(1, userText.getText()); 
     ps.setString(2, new String(passText.getPassword())); 
     ResultSet rs = ps.executeQuery(); 

     if(rs.next()) 
      //RETURN USERNAME BACK TO MAIN CLASS...How? 
     else 
      JOptionPane.showMessageDialog(this, "Incorrect username or password.", "", JOptionPane.ERROR_MESSAGE); 
    } 
    catch (SQLException e) { 
     utils.Print.print(e.getMessage()); 
     printSuppressed(e); 
    } 
    finally{ 
    } 
} 
//... 
Login(Connection connect){ 
///... 
    JButton login = new JButton(new loginAction()) 
//... 
} 
+0

參見來接入信息使用多個JFrames,好/壞實踐?](http://stackoverflow.com/a/9554657/418556) –

回答

4

不要使用一個JFrame這個,因爲這是爲了創建模態對話框,如JDialogs和JOptionPanes 。這是他們存在的原因,如果你不使用它們,他們會很傷心。儘管如此,當你調用一個JOptionPane時,你會知道發生了什麼,調用程序中的代碼如何停止並等待JOptionPane返回,這就是模態JDialog所做的事情(事實上JOptionPane只是JDialog的一個變體),這就是你想要的行爲。

請注意,無論您是否使用JFrame,都幾乎不應該有類擴展JFrame。將代碼轉換爲創建JPanel,然後將它們填充到JDialogs,JFrames或任何需要顯示它們的容器時。

1

做到這一點的一種方法是用設置操作內部變量的行代替註釋行。然後,您需要保留對該操作的引用。

例如,

loginAction la = new loginAction() 
JButton login = new JButton(la) 

.... 

// some other code block with reference to la 
if(la.isUsernameValid()) 
    la.getUsername() 

正如@Hovercraft提到,雖然有更好的方法來做到這一點

2
  1. 避免頂層容器延伸等,其中可能的框架和對話,更好地將你的UI組件放到JPanel上。從長遠來看,它爲您提供了更大的靈活性和重用選項。
  2. 使用JDialog而不是JFrame,或者更好的辦法是使用JOptionPane它是否會照顧到按鈕(雖然在您執行驗證檢查之前它需要關閉對話框)。
  3. 不要在事件調度線程執行長時間運行或阻斷代碼(如訪問數據庫)
  4. 內部維護的用戶信息,並允許呼叫對象經由吸氣