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();
}
}
私はactionPerformedメソッドに変更を加えました。これでGUIはクリックされた後もフリーズしません。ただし、サーバーは、ボタンがクリックされた後に1回だけ応答します。その後のクリックでは、サーバーからクライアントに何も送信されません。これが起こる原因となるものを私に提案できますか? – KMuir
@KMuir Socketを使用するには、Socketからのデータを待つための "whileループ"が必要です。 [Javaチュートリアル](http://docs.oracle.com/javase/tutorial/index.html)を参照してください。あなたが始めるために 'ソケット 'に関するセクションがあります。 – camickr