السلام عليكم
ما أعنيه بال zebra effect هو جعل كل سطر من ال JList مختلف عن الذي بعده، مثل ما يظهر في الصورة.
بما أننا سنغير طريقة رسم الخلايا، فسنقوم بالتعديل على ال cell renderer، حيث أن JList لا تقوم بنفسها برسم الخلايا. سنستعمل الفئة DefaultListCellRenderer
داخل هذه الفئة، سنعمل override للطريقة getListCellRendererComponent. هذه الطريقة تعيد المكون الذي سيقوم برسم الخلية.
المبدأ بسيط، الطريقة getListCellRendererComponent تنتظر عدة argument، من بينها ال index الخاص بالخلية، لذلك يكفي أن نتحقق من هذا ال index، فإذا كان odd نعطيه لونا، وإذا كان even نعطيه لونا آخر.
أظن أن الكود واضح بما فيه الكفاية
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
public class ZebraList extends JList {
private Color firstColor, secondColor;
public ZebraList(Color firstColor, Color secondColor) {
this.firstColor = firstColor;
this.secondColor = secondColor;
setCellRenderer(new ZebraCellRenderer());
}
class ZebraCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) { // نريد أن نحفظ المظهر الإفتراضي للخلية عند اختيارها
setBackground(getSelectionBackground());
setForeground(getSelectionForeground());
} else if (index % 2 == 0) {
setBackground(firstColor);
} else {
setBackground(secondColor);
}
this.setText(value.toString());
return this;
}
}
public static void main(String[] args) {
JFrame frm = new JFrame();
DefaultListModel model = new DefaultListModel();
model.addElement("Element1");
model.addElement("Element2");
model.addElement("Element3");
model.addElement("Element4");
model.addElement("Element5");
model.addElement("Element6");
ZebraList list = new ZebraList(new Color(0xd0d8e0), new Color(0x83B9EE));
list.setModel(model);
frm.add(list, BorderLayout.CENTER);
frm.setSize(100, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}موضوع جميل عن ال JList للأخ وجدي : Swing JList Hacking

