2017-12-04 5 views
0

안녕하세요 저는 사용자가 학생 데이터베이스에서 ID 또는 이름 (둘 다 고유하다고 가정)을 사용하여 특정 학생을 검색하고 정보를 표시 할 수있는 GUI 프로그램을 만들려고합니다. 이름, ID, GPA 등. 내가 이름이나 학생 정보는 GUI 프로그램의 아래 부분에 표시되어야 ID를 사용하여 검색하면 같은개체 배열을 검색

곳 JLabel의 (학생 정보) 학생 데이터베이스 파일의

샘플

12345 Mark 3.6 
72305 Sam 2.8 
12945 Chris 3.1 
18325 John 2.5 
52341 Drake 2.7 
98475 Sara 3.8 
24536 Robin 3.1 
34765 Ted 3.6 
23845 Kelly 3.1 

이름이나 ID로 검색 할 때 왜 오류가 발생하는지 알 수 없습니까? 또한 검색 후 학생 정보를 표시 할 수 있습니까?

그래 내가 다른 검색 방법 이름 다른 하나는 ID 여기

에 대한 다른 사용하고 내 코드의 프로그램이

Sample of the GUI Program interface

과 같은

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; 
import javax.swing.*; 


public class GUIProgram extends JFrame implements ActionListener { 

JLabel name, id, stInfo; 
JButton clearBtn, searchName, searchID; 
JTextField nameTxt, idTxt, nameInfo, idInfo, gpaInfo; 
int i ; 
String n; 
public static void main(String[] args) { 
    new GUIProgram(); 
} 


public GUIProgram(){ 
    super("GUIProgram"); 
    setTitle("Student Database"); 
    setLayout(new FlowLayout()); 
    setSize(480, 200); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    JPanel searchPanel = new JPanel(new FlowLayout()); 
    name = new JLabel("Name: "); 
    nameTxt = new JTextField(10); 
    id = new JLabel("ID: "); 
    idTxt = new JTextField(10); 
    clearBtn = new JButton("Clear"); 
    clearBtn.addActionListener(this); 

    searchPanel.add(name); 
    searchPanel.add(nameTxt); 
    searchPanel.add(id); 
    searchPanel.add(idTxt); 
    searchPanel.add(clearBtn); 
    add(searchPanel,BorderLayout.NORTH); 

    JPanel centerPanel = new JPanel(new FlowLayout()); 
    searchName = new JButton("Search By Name"); 
    searchID = new JButton("Search By ID"); 

    centerPanel.add(searchName); 
    centerPanel.add(searchID); 
    add(centerPanel,BorderLayout.CENTER); 

    JPanel infoPanel = new JPanel(new FlowLayout()); 

    stInfo = new JLabel("Student Info: "); 
    nameInfo = new JTextField(10); 
    nameInfo.setEditable(false); 
    idInfo = new JTextField(10); 
    idInfo.setEditable(false); 
    gpaInfo = new JTextField(10); 
    gpaInfo.setEditable(false); 

    infoPanel.add(stInfo); 
    infoPanel.add(nameInfo); 
    infoPanel.add(idInfo); 
    infoPanel.add(gpaInfo); 

    add(infoPanel,BorderLayout.SOUTH); 

    searchID.addActionListener(this); 
    searchName.addActionListener(this); 

    setVisible(true); 

} 

public void actionPerformed(ActionEvent ae) { 
    Object source = ae.getSource(); 
    if (source == clearBtn); 
    nameTxt.setText(""); 
    idTxt.setText(""); 

    try{ 
     Scanner file = new Scanner(new File("StudentDB.txt")); 

     ArrayList<Integer> id = new ArrayList<Integer>(); 
     ArrayList<String> name = new ArrayList<String>(); 
     ArrayList<Double> gpa = new ArrayList<Double>(); 

     while(file.hasNext()){ 
      id.add(file.nextInt()); 
      name.add(file.next()); 
      gpa.add(file.nextDouble()); 
     } 

     Student [] stList = new Student[9]; 
     for(int i = 0; i < name.size(); i++){ 
      stList[i] = new Student(id.get(i), name.get(i), gpa.get(i)); 
     } 

     n = nameTxt.getText(); 
     i = Integer.parseInt(idTxt.getText()); 
     try { 

      if(source == searchName){ 
       linearSearch(stList, n); 

      } 
      else if(source == searchID){ 
       binarySearch(stList, i); 
      } 
     }catch(InputMismatchException e){ 
      JOptionPane.showMessageDialog(null, "Input Mismatch Exception"); 
     } 

    }catch(InputMismatchException | FileNotFoundException e){ 
     JOptionPane.showMessageDialog(null, "Input Mismatch Exception"); 
    } 


} 

/*static final int NONE = -1; // not a legal index 
static int linearSearch(int id, Student[] a) { 
for (int i = 0; i < a.length; i++) { 
    if (id == a[i]) 
return i; 
} 
return NONE; 
}*/ 

static final int NONE = -1; // not a legal index 
static int linearSearch(Student[] a, String name) { 
    for (int p = 0; p < a.length; p++) {  
     if (name.equals(a[p])) 

      return p; 
     } 
    return NONE; 
    } 


public static int binarySearch(Student[] a, int x) { 
    int low = 0; 
    int high = a.length - 1; 
    int mid; 

    while (low <= high) { 
     mid = (low + high)/2; 

     if (a[mid].compareTo(x) < 0) { 
      low = mid + 1; 
     } else if (a[mid].compareTo(x) > 0) { 
      high = mid - 1; 
     } else { 
      return mid; 
     } 
    } 

    return -1; 
} 


class Student implements Comparable{ 
    int iDNumber; 
    String name; 
    double gpa; 

    public Student(int iDNumber, String name, double gpa){ 
     this.iDNumber = iDNumber; 
     this.name = name; 
     this.gpa = gpa; 
    } 
    public int getiDNumber() { 
     return iDNumber; 
    } 
    public void setiDNumber(int newId) { 
     this.iDNumber = newId; 
    } 
    public void setGpa(double newGpa) { 
     this.gpa = newGpa; 
    } 
    public void setName(String newName) { 
     this.name = newName; 
    } 
    public String getName() { 
     return name; 
    } 
    public double getGPA() { 
     return gpa; 
    } 

    public String toString(){ 
     return iDNumber+"\t"+name+"\t"+gpa; 
    } 


    public int compareTo(Object o) { 
     if(o == null) { 
      throw new NullPointerException(); 
      } 
     else if(o.getClass()!= getClass()) { 
       throw new ClassCastException(); 
      } 
     else if(o.getClass()== getClass()) { 
       Student st = (Student) o; 
       return iDNumber - st.getiDNumber(); 
      } 
      else { 

       Student st = (Student) o; 
       return (int) (gpa - st.getGPA()); 
     } 
    } 



} // end of st 



class ComparatorId implements Comparator { 
    public int compare(Object o1, Object o2) { 
     if(o1 == null | o2 == null) 
      throw new NullPointerException(); 
     else { 
      if(!(o1 instanceof Student) | !(o2 instanceof Student)) 
       throw new ClassCastException(); 
      else { 
       Student st1 = (Student) o1; 
       Student st2 = (Student) o2; 
       return st1.getiDNumber() - st2.getiDNumber(); 
      } 
     } 
    } 
} // End of ComparatorId class 


class ComparatorGPA implements Comparator { 
    public int compare(Object o1, Object o2) { 

     if(o1 == null | o2 == null) 
      throw new NullPointerException(); 
     else { 
      if(!(o1 instanceof Student) | !(o2 instanceof Student)) 
       throw new ClassCastException(); 
      else { 
       Student st1 = (Student) o1; 
       Student st2 = (Student) o2; 
       return Double.compare(st1.getGPA(), st2.getGPA()); 

     // return ((Student) o1).getGPA().compareTo2((Student) o2).getGPA())); 
     // return (int)(((Student) o1).getGPA()).compareTo2((Double)o1.getGPA()); 
    } 
     } 
    } 
} // End of ComparatorGPA class 

class ComparatorName implements Comparator { 
    public int compare(Object o1, Object o2) { 
     return ((Student) o1).getName().compareTo(((Student) o2).getName()); 

    } 
}// End of ComparatorName class 
} 

+0

어떤 오류가 발생합니까? –

+0

ID로 검색하려고 시도 할 때 오류가 발생합니다. "AWT-EventQueue-0"예외 java.lang.NumberFormatException : 입력 문자열의 경우 : "" \t at java.lang.NumberFormatException. forInputString (알 수없는 소스) java.lang.Integer.parseInt (알 수없는 소스) java.lang.Integer.parseInt에서 \t (알 수없는 소스)에서 \t이 Exercise2.actionPerformed (Exercise2.java:116)에서 \t – Ammar

+0

내가 돈 ' 내 검색 방법이 올바르게 작동하는지 실제로 알지 못합니다. – Ammar

답변

2

작성한 코드에는 몇 가지 문제가 있지만, 주로 작은 버그가 있습니다.

오류를 줄 수있는 항목은 i=Integer.parseInt(idTxt.getText());입니다.이 줄은 idTxt 상자에있는 내용을 가져 와서 int로 변환하려고 시도하기 때문입니다. 숫자를 입력하면 정상적으로 작동하지만 이름을 검색하지 않고 비워 두거나 ""남겨두면됩니다. 작업 소스가 searchID와 같은지 확인하기 전에 구문 분석을 수행하므로 빈 문자열을 구문 분석합니다. 텍스트 필드에 숫자가 있음을 알게되면 구문 분석을 수행하면 오류가 발생하지 않습니다. EG :

if(source == searchID){ 
    i=Integer.parseInt(idTxt.getText()); 
} 

String 객체가 학생 오브젝트와 동일한 경우에도, 귀하의 LinearSearch 방법 당신이 name.equals(a[p]) 당신이보고있는하고 있습니다. 대신 name.compareTo(a[p].getName()) 같은 것을 할 수 있습니다.이 두 문자열을 직접 비교하여 두 문자열이 같은지 확인합니다.

마지막으로, 바이너리 검색은 정렬 된 배열에서만 작동하기 때문에 Student Array를 처음 정렬 할 때 사용할 수있는 학생 ID의 이진 검색을 사용하고 있습니다. LinearSearch 메서드의 오버로드 된 버전을 사용하여 int를 가져 와서 Student 객체의 id와 비교합니다.