현재 데이터베이스에서 데이터를 가져 와서 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에 추가 할 때만 문제가 발생합니다.
* "JTable을 사용하지 않는 이유는 내 미적 요구를 만족시키지 않기 때문입니다. * 다른 PLAF를 사용하십시오. –
그러나 나는 그것을 사용하지 않기로 결정했다. – gedr
'parent.add ("West", box);'마법의 숫자를 사용하지 마라. 'parent.add (box, BorderLayout.WEST);가 가장 좋았습니다. parent.add (box, BorderLayout.LINE_START); ' –