2017-04-03 11 views
1

ユーザーのユーザー名とパスワードを入力したら、ボタンをクリックしてストリームをサーバーに送信して、ユーザーを認証する必要があるかどうかを判断します。ボタンは無効になっているかのように機能しなくなります。JButtonがクリックされた後に非アクティブになるのはなぜですか?

public class EmployeeSignIn extends JFrame implements ActionListener { 
    private JLabel lblUsername, lblPassword; 
    private JTextField txtUsername; 
    private JPasswordField jpfPassword; 
    private JButton btnSubmit; 
    private JPanel pnlButton, pnlLogo, pnlComponents1, pnlComponents2; 
    private Socket socket; 
    private ObjectOutputStream oos; 
    private ObjectInputStream ois; 

    private void initializeStreamComponents() { 
     try { 
      socket = new Socket("localhost", 4200); 
      oos = new ObjectOutputStream(socket.getOutputStream()); 
      ois = new ObjectInputStream(socket.getInputStream()); 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 

    private void initComponent() { 
     initializeStreamComponents(); 

     lblUsername = new JLabel("Username"); 
     lblPassword = new JLabel("Password"); 

     txtUsername = new JTextField(); 

     jpfPassword = new JPasswordField(); 

     btnSubmit = new JButton("Sign In"); 

     pnlButton = new JPanel(); 
     pnlLogo = new JPanel(new GridLayout(1, 2)); 
     pnlComponents1 = new JPanel(new GridLayout(1, 2, 3, 3)); 
     pnlComponents2 = new JPanel(new GridLayout(1, 2, 3, 3)); 
    } 

    private void addComponentsToPanel() { 

     pnlLogo.add(new JLabel(new ImageIcon("img/app.png"))); 

     pnlComponents1.add(lblUsername); 
     pnlComponents1.add(txtUsername); 

     pnlComponents2.add(lblPassword); 
     pnlComponents2.add(jpfPassword); 

     pnlButton.add(btnSubmit); 
    } 

    private void addPanelsToWindow() { 
     Container container = getContentPane(); 
     container.add(pnlLogo); 
     container.add(pnlComponents1); 
     container.add(pnlComponents2); 
     container.add(pnlButton); 
    } 

    private void registerListeners() { 
     btnSubmit.addActionListener(this); 
    } 

    private void setWindowProperties() { 
     this.setTitle("ARD-Employee"); 
     this.setLayout(new GridLayout(4, 2)); 
     this.setVisible(true); 
     this.setSize(450, 200); 
     this.setResizable(false); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLocationRelativeTo(null); 
    } 

    public EmployeeSignIn() { 
     this.initComponent(); 
     this.addComponentsToPanel(); 
     this.addPanelsToWindow(); 
     this.registerListeners(); 
     this.setWindowProperties(); 
    } 

    private boolean validateFields() { 
     if (!textFieldCheck(txtUsername)) { 
      txtUsername.grabFocus(); 
      System.out.println(1); 
      System.out.println("Please enter your username"); 
      System.out.println(2); 
      return false; 
     } 

     if (!textFieldCharacterCheck(txtUsername)) { 
      txtUsername.grabFocus(); 
      System.out.println("No Special Characters Allowed in Username!"); 
      return false; 
     } 

     if (!passwordFieldCheck(jpfPassword)) { 
      jpfPassword.grabFocus(); 
      System.out.println("Please Enter your Password!"); 
      return false; 
     } 
     return true; 
    } 

    private boolean textFieldCheck(JTextField field) { 
     if (field.getText().trim().isEmpty()) { 
      field.grabFocus(); 
      return false; 
     } 
     return true; 
    } 

    private boolean passwordFieldCheck(JPasswordField field) { 
     String password = new String(field.getPassword()); 
     if (password.trim().isEmpty()) { 
      return false; 
     } 
     return true; 
    } 

    private boolean textFieldCharacterCheck(JTextField field) { 
     return field.getText().matches("^\\d+$"); 
    } 

    public String getUsername() { 
     return txtUsername.getText(); 
    } 

    public String getPassword() { 
     return new String(jpfPassword.getPassword()); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton src = (JButton) e.getSource(); 

     new Thread() { 
      @Override 
      public void run() { 
       if (src.equals(btnSubmit)) { 
        if (validateFields()) { 
         sendStreamsToServer(); 
        } 
       } 
      } 
     }.start(); 
    } 

    private void sendStreamsToServer() { 
     try { 

      String userType = "employee"; 
      oos.writeObject(userType); 

      oos.writeObject(this.getUsername()); 
      System.out.println("USERNAME: " + this.getUsername()); 
      oos.writeObject(this.getPassword()); 
      System.out.println("PASSWORD: " + this.getPassword()); 

      String readObj = (String) ois.readObject(); 
      System.out.println("READ OBJECT: " + readObj); 

      boolean validationCheck = (boolean) ois.readObject(); 
      System.out.println("Employee/VALIDATION CHECK: " + validationCheck); 

     } catch (IOException e1) { 
      System.err.println(e1.getMessage()); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private void closeConnection() { 
     try { 
      oos.close(); 
      ois.close(); 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } 
    } 

    public static void main(String[] args) { 
     new EmployeeSignIn(); 
    } 
} 

答えて

4

あなたActionListenerSocketに接続されます。 Socketブロックは入力を待っています。このコードはEvent Dispatch Thread (EDT)で実行されるため、GUIがフリーズします。

解決策はSocketに別のThreadで接続することです。

EDTの詳細については、ConcurrencyのSwingチュートリアルのセクションをお読みください。 ThreadとしてSwingWorkerを使用することをおすすめします。 SwingWorker APIを使用すると、必要に応じてGUIを簡単に更新できます。

+0

私はactionPerformedメソッドに変更を加えました。これでGUIはクリックされた後もフリーズしません。ただし、サーバーは、ボタンがクリックされた後に1回だけ応答します。その後のクリックでは、サーバーからクライアントに何も送信されません。これが起こる原因となるものを私に提案できますか? – KMuir

+0

@KMuir Socketを使用するには、Socketからのデータを待つための "whileループ"が必要です。 [Javaチュートリアル](http://docs.oracle.com/javase/tutorial/index.html)を参照してください。あなたが始めるために 'ソケット 'に関するセクションがあります。 – camickr

関連する問題