2014-04-10 2 views
0

현재 데이터베이스에서 데이터를 가져 와서 JPanel의 하위 클래스 인 DataPanel에 표시하는 학교용 포인트 시스템을 만들고 있습니다.이 클래스는 각 개별 셀인 학생 클래스로 채워져 있습니다. 이것은 JPanel의 하위 클래스이기도합니다. JTable을 사용하지 않는 이유는 내 미적 요구를 만족시키지 않기 때문입니다. 어쨌든, 그냥 학생 클래스를 DataPanel에 추가하면 잘 작동하지만 BorderLayout 레이아웃이있는 부모 JPanel을 만들어 JCheckBox를 추가하고 West의 확인란과 Center의 Student를 추가하면, DataPanel의 크기가 데이터베이스의 모든 데이터를 수용해야하더라도 한 셀만 표시합니다. 여기하나의 항목 만 JPanel에 표시됩니까?

그리고 DataPanel 클래스의 코드입니다 :

class DataPanel extends JPanel{ 
static Student[] students; 
public DataPanel(String[][] data) { 
    try{setLayout(new GridLayout(data.length,1));} catch(Exception e) { 
     GUI.control.updateUI(); 
     JOptionPane.showMessageDialog(null, "The search criteria you have entered is incorrect and did not generate any outcome.", "Invalid Search Criteria", JOptionPane.ERROR_MESSAGE); 
    } 
    setPreferredSize(new Dimension(382,data.length*20)); 
    students = new Student[data.length-1]; 
    JPanel parent = new JPanel(new BorderLayout()); 
    for(int i = 0; i < data.length; i++) { 
     Student contents = new Student(); 
     JLabel[] labels = new JLabel[4]; 
     for(int x = 0; x < data[0].length; x++) { 
      JLabel cur = new JLabel(" "+data[i][x]); 
      cur.setFont(new Font("Arial", Font.PLAIN,12)); 
      labels[x] = cur; 
      //System.out.println(data[0].length); 

      contents.add(cur); 

     } 

     contents.setId(labels[0]); 
     contents.setName(labels[1]); 
     contents.setForm(labels[2]); 
     contents.setPoints(labels[3]); 
     contents.setParent(parent); 
     JCheckBox box = new JCheckBox(); 

     contents.setCheckBox(box); 

     parent.setBorder(BorderFactory.createLineBorder(Color.lightGray)); 
     parent.add("Center", contents); 
     parent.add("West", box); 
     add(contents); // >> parent = only one showing? 
     System.out.println(i); 
     if(i == 0) { 
      parent.setBackground(new Color(200,200,255)); 
     } 
     if(i != 0) { 
      students[i-1] = contents; 
     } 
    } 
} 

public static void refresh() { 
    for(Student i: students) { 
     if(i != Student.getSelected()) { 
     i.setBackground(Color.white); 
     } 
    } 

} 

}

및 학생 클래스 :

여기에 몇 가지 사진과 코드는
class Student extends JPanel implements MouseListener { 
JLabel name; 
JLabel id; 
JLabel points; 
JLabel form; 
JCheckBox box; 
JPanel parent; 

private static Student selected; 

public Student() { 
    super(new GridLayout()); 
    addMouseListener(this); 
} 

public void setParent(JPanel parent) { 
    this.parent = parent; 
    parent.setBackground(Color.white); 
} 

public void setCheckBox(JCheckBox box) { 
    this.box = box; 
} 
public void setName(JLabel name) { 
    this.name = name; 
} 

public void setId(JLabel id) { 
    this.id = id; 
} 

public void setPoints(JLabel points) { 
    this.points = points; 
} 

public void setForm(JLabel form) { 
    this.form = form; 
} 

@Override 
public void mouseClicked(MouseEvent e) { 
    if(name.getText().equals(" Student")) { 
     parent.setBackground(new Color(200,200,255)); 
     return; 
    } 
    parent.setBackground(new Color(255,255,190)); 
    setSelected(this); 
    DataPanel.refresh(); 
} 

@Override 
public void mouseEntered(MouseEvent e) { 
    if(name.getText().equals(" Student")) { 
     parent.setBackground(new Color(200,200,255)); 
     return; 
    } 
    if(this == getSelected()) { 
     parent.setBackground(new Color(255,255,190)); 
    } else { 
    parent.setBackground(new Color(230,230,255)); 
    } 

}

@Override 
public void mouseExited(MouseEvent e) { 
    if(name.getText().equals(" Student")) { 
     parent.setBackground(new Color(200,200,255)); 
     return; 
    } 
    if(this == getSelected()) { 
     parent.setBackground(new Color(255,255,210)); 
    } else { 
    parent.setBackground(Color.white); 
    } 
} 

@Override 
public void mousePressed(MouseEvent e) { 

} 

@Override 
public void mouseReleased(MouseEvent e) { 

} 

public static Student getSelected() { 
    return selected; 
} 

public static void setSelected(Student selected) { 
    Student.selected = selected; 
} 

} 사전에 도움을

감사합니다, 그리고 당신이 더 많은 정보가 필요하면 말해 ...

아, 그리고 방법으로는에 더주의를 지불하지 실제 데이터는 테스트 목적으로 만 존재합니다.

EDIT : (JPanel)이 아닌 parent (JPanel)을 DataPanel에 추가 할 때만 문제가 발생합니다.

+0

* "JTable을 사용하지 않는 이유는 내 미적 요구를 만족시키지 않기 때문입니다. * 다른 PLAF를 사용하십시오. –

+0

그러나 나는 그것을 사용하지 않기로 결정했다. – gedr

+0

'parent.add ("West", box);'마법의 숫자를 사용하지 마라. 'parent.add (box, BorderLayout.WEST);가 가장 좋았습니다. parent.add (box, BorderLayout.LINE_START); ' –

답변

0

답변을 찾았습니다. 꽤 벙어리.

음, 기본적으로, 나는 JPanel의 '부모'루프 외부의 생성자를했다, 그래서 하나를 생성하고, JPanel의에 모든 데이터를 추가했습니다. 이것이 단지 하나만 나타난 이유입니다. 나를 도우려는 모든 분들께 감사드립니다. 죄송합니다.

관련 문제