2017-06-19 53 views
-1

我有一個註冊按鈕,當我按下注冊按鈕時,它應該將值寫入到在textfield中鍵入的details.txt。當我第一次註冊它的工作,但如果文件包含一些值,它會凍結,如果我嘗試第二次註冊。任何人都可以幫助調試此pls?當使用fileWriter寫入文件時,Java應用程序會凍結

主類

package assignment; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Assignment 
{ 
JFrame mainFrame; 
JPanel framePanel,leftPnl,topPnl,btmPnl; 
JLabel welcomeLabel,studId,passwd; 
JTextField studField,passField; 
JButton logBtn,signBtn; 
Color btnClr,btnTxtClr,backgroundClr,lblClr; 


Font mainFont,labelFont; 

public void mainPage() 
{ 
    mainFrame = new JFrame("CGPA Calculator"); 
    framePanel = new JPanel(); 

//-------------------Creating Components/Setting Fonts/Color---------------- 
-------------------------------------------  
    //Color 
    btnClr = new Color(0, 179, 60); 
    btnTxtClr = new Color(255,255,255); 
    backgroundClr = new Color(26, 26, 26); 
    lblClr = new Color(255,255,255); 

    //Fonts 
    mainFont = new Font("Verdana",Font.PLAIN,40); 
    labelFont = new Font("Verdana",Font.PLAIN,20); 

    //Button 

    logBtn = new JButton("<html><font face=\"Verdana\">Login</font></html>");//Source from:https://stackoverflow.com/questions/21046164/jbutton-text-with-different-font-family-in-different-words 
    logBtn.setFocusPainted(false); 
    logBtn.setBackground(btnClr); 
    logBtn.setForeground(btnTxtClr);  


    signBtn = new JButton("<html><font face=\"Verdana\">Register</font></html>"); 
    signBtn.setFocusPainted(false); 
    signBtn.setBackground(btnClr); 
    signBtn.setForeground(btnTxtClr);  

    //Label 
    welcomeLabel = new JLabel("CGPA Calculator"); 
    welcomeLabel.setForeground(lblClr); 
    studId = new JLabel("Student ID :"); 
    studId.setForeground(lblClr); 
    passwd = new JLabel("Password :"); 
    passwd.setForeground(lblClr); 

    //TextField 
    studField = new JTextField(8); 

studField.setBorder(javax.swing.BorderFactory.createEmptyBorder());//Sourced From:https://stackoverflow.com/questions/2281937/swing-jtextfield-how-to-remove-the-border 
    passField = new JTextField(8); 
    passField.setBorder(BorderFactory.createEmptyBorder()); 

    //Adding Fonts to Components 
    welcomeLabel.setFont(mainFont); 
    studId.setFont(labelFont); 
    passwd.setFont(labelFont); 

    //Panel 
    leftPnl = new JPanel(); 
    topPnl = new JPanel(); 
    btmPnl = new JPanel(); 

//----------------------Adding of panels/layout/components-------------------------------------------------------- 

    //Seting up layouts to panel 
    leftPnl.setLayout(new FlowLayout()); 
    btmPnl.setLayout(new BoxLayout(btmPnl,BoxLayout.X_AXIS)); 

    //TOPPANEL(Adjustments) 
    topPnl.setBackground(backgroundClr); 
    topPnl.add(welcomeLabel); 
    topPnl.add(Box.createRigidArea(new Dimension(0,150)));  

    //LEFTPANEL(Adjustements) 
    leftPnl.setBackground(backgroundClr); 
    leftPnl.add(Box.createRigidArea(new Dimension(0,70))); 
    leftPnl.add(studId); 
    leftPnl.add(studField); 
    leftPnl.add(passwd); 
    leftPnl.add(passField); 

    //BOTTOMPANEL 
    btmPnl.setBackground(backgroundClr); 
    btmPnl.add(Box.createRigidArea(new Dimension(130,0))); 
    btmPnl.add(logBtn); 
    btmPnl.add(Box.createRigidArea(new Dimension(40,0))); 
    btmPnl.add(signBtn); 
    btmPnl.add(Box.createRigidArea(new Dimension(200,200))); 


    //Action Listeners(lambda expression) 
    signBtn.addActionListener((ActionEvent e) -> { 
    SignUpPage sign = new SignUpPage(); 
    sign.SecondPage(); 
    sign.getFrame().setVisible(true); 
    //mainFrame.setVisible(false); 

    }); 



    mainFrame.getContentPane().setBackground(backgroundClr); 
    mainFrame.add(topPnl,BorderLayout.NORTH); 
    mainFrame.add(leftPnl,BorderLayout.WEST); 
    mainFrame.add(btmPnl,BorderLayout.SOUTH); 
    mainFrame.setVisible(true); 
    mainFrame.setSize(450,450); 
    mainFrame.setResizable(false); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public static void main(String[] args) 
{ 
    Assignment display = new Assignment(); 
    display.mainPage(); 
    new SignUpPage(); 

}  
} 

寄存器類別

package assignment; 
import javax.swing.*; 
import java.awt.*; 
import java.lang.*; 
import java.awt.event.*; 
import java.io.*; 


public class SignUpPage 
{ 
private JFrame signFrame; 
JTextField idField,passwdField; 
JButton registerBtn,cancelBtn,resetBtn; 
JLabel studIdLbl,passwdLbl,schoolLbl,label; 
JComboBox schoolBox; 
String [] school = {"School Of Computing & Creative Media","School Of 
Communication & Creative Arts","School Of Engineering","School Of Business" 
        ,"School of Hospiality Tourism & Culinary Arts"}; 
Font labelFont; 
Color btnClr,btnTxtClr,lblClr,backgroundClr; 
String selectSchool; 
BufferedReader validateFile; 
String details; 
String detailsArray[]; 
int detailsExists = 0; 


public void SecondPage() 
{ 
    //ComboBox(Class) 
    label = new JLabel(""); 

    //Color 
    btnClr = new Color(0, 179, 60); 
    btnTxtClr = new Color(255,255,255); 
    backgroundClr = new Color(26, 26, 26); 
    lblClr = new Color(255,255,255); 

    //Font 
    labelFont = new Font("Verdana",Font.PLAIN,13); 

    //JTextField 
    idField = new JTextField("Student ID",4); 
    idField.setMinimumSize(new Dimension(300,30)); 
    idField.setMaximumSize(new Dimension(300,30)); 
    idField.setBorder(javax.swing.BorderFactory.createEmptyBorder()); 


    passwdField = new JTextField("Password",4); 
    passwdField.setMinimumSize(new Dimension(300,30)); 
    passwdField.setMaximumSize(new Dimension(300,30)); 
    passwdField.setBorder(javax.swing.BorderFactory.createEmptyBorder()); 


    //JComboBox 
    schoolBox = new JComboBox(school); 
    schoolBox.setFont(labelFont); 
    schoolBox.setMinimumSize(new Dimension(300,30)); 
    schoolBox.setMaximumSize(new Dimension(300,30)); 
    schoolBox.addActionListener((ActionEvent e)->{ 
     JComboBox <String> schoolCombo = (JComboBox<String>) e.getSource(); 
     selectSchool = (String) schoolCombo.getSelectedItem(); 
    }); 

    //Panel 
    JPanel fieldPnl = new JPanel(); 
    JPanel btnPnl = new JPanel(); 

    //Button 
    registerBtn = new JButton("<html><font face=\"Verdana\">Register</font></html>"); 
    registerBtn.setBackground(btnClr); 
    registerBtn.setForeground(lblClr); 
    cancelBtn = new JButton("<html><font face=\"Verdana\">Cancel</font></html>"); 
    cancelBtn.setBackground(btnClr); 
    cancelBtn.setForeground(lblClr); 
    resetBtn = new JButton("<html><font face=\"Verdana\">Reset</font></html>"); 
    resetBtn.setBackground(btnClr); 
    resetBtn.setForeground(lblClr); 


    //Label 
    studIdLbl = new JLabel("Student ID:"); 
    passwdLbl = new JLabel("Password"); 
    schoolLbl = new JLabel("School:"); 

    //Adding Components to Panel   
    fieldPnl.add(Box.createRigidArea(new Dimension(0,100))); 
    fieldPnl.setBackground(backgroundClr); 
    fieldPnl.add(idField); 
    fieldPnl.add(Box.createRigidArea(new Dimension(0,10))); 
    fieldPnl.add(passwdField); 
    fieldPnl.add(Box.createRigidArea(new Dimension(0,10))); 
    fieldPnl.add(schoolBox); 
    fieldPnl.add(Box.createRigidArea(new Dimension(0,50))); 

    btnPnl.setBackground(backgroundClr); 
    btnPnl.add(registerBtn); 
    btnPnl.add(cancelBtn); 
    btnPnl.add(resetBtn); 
    btnPnl.add(label); 
    btnPnl.add(Box.createRigidArea(new Dimension(0,190))); 



    //Layout 
    fieldPnl.setLayout(new BoxLayout(fieldPnl,BoxLayout.Y_AXIS)); 


    //Action Listener 
     registerBtn.addActionListener(new ActionListener() {    
     @Override 
     public void actionPerformed(ActionEvent e) { 

      BufferedWriter toFile;     
      try { 
       signUpValidation(); 
       if(detailsExists==0) 
       { 
        toFile = new BufferedWriter(new FileWriter("details.txt",true)); 
        toFile.write(idField.getText() + "," + passwdField.getText() + ","+selectSchool); 
        toFile.newLine(); 
        toFile.flush(); 
       } 
       else if(detailsExists==1) 
       { 
        //same values exists in file 
       } 




      } catch(FileNotFoundException ex) { 
       ex.printStackTrace(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

     } 
    }); 

    signFrame = new JFrame("Sign Up");  
    signFrame.add(btnPnl,BorderLayout.SOUTH); 
    signFrame.add(fieldPnl,BorderLayout.CENTER); 
    signFrame.setVisible(true); 
    signFrame.setSize(450,450); 
    signFrame.setResizable(false); 
    signFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
} 

public Frame getFrame() 
{ 
    return signFrame; 
}  


public int signUpValidation() throws IOException 
{ 

    validateFile = new BufferedReader(new FileReader("details.txt")); 
    details = validateFile.readLine(); 
    while(details!=null) 
    { 
     detailsArray=details.split(","); 
     if(idField.equals(detailsArray[0]) || passwdField.equals(detailsArray[1])) 
     { 
      detailsExists = 1; 
     } 
     else 
      detailsExists = 0; 

    } 
     return detailsExists; 
} 
} 

回答

1

while(details!=null)防止環路從不斷退出,因爲details沒有在循環的情況下與更新 - 它永遠不會成爲null

東西像...

String details = null; 
while((details = validateFile.readLine()) !=null) {... 

可能更安全。但是根據你的代碼,你只需要一行代碼,所以完全擺脫循環可能是一個更好的解決方案

+0

謝謝你刪除或使用你的代碼作品。 –

相關問題