import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
public class LoadingListDemo extends JFrame {
private List<ListEntity> entityList;
private JList jList;
public LoadingListDemo () {
entityList = new ArrayList<ListEntity>();
for (int i=0; i<6; i++)
entityList.add(new ListEntity("Entity " + i));
DefaultListModel model = new DefaultListModel();
for (ListEntity e : entityList)
model.addElement(e);
jList = new JList(model);
jList.setCellRenderer(new LoadingRenderer());
this.getContentPane().add(new JScrollPane(jList));
new Thread(new DataLoader(entityList)).start();
}
class LoadingRenderer extends DefaultListCellRenderer {
private JPanel panel;
private JLabel title;
private JProgressBar bar;
private Border border;
public LoadingRenderer() {
panel = new JPanel(new GridLayout(2, 1));
panel.add(title = new JLabel());
panel.add(bar = new JProgressBar());
bar.setOpaque(false);
panel.setBorder(border = BorderFactory.createLineBorder(Color.GRAY));
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
ListEntity ent = (ListEntity) value;
if (ent.getStatus()<100) {
panel.setBackground(this.getBackground());
if (ent.getStatus()==0) {
title.setForeground(Color.LIGHT_GRAY);
title.setText(" " + ent.getTitle() + " waiting...");
}
else {
title.setForeground(Color.BLUE);
title.setText(" " + ent.getTitle() + " loading...");
}
bar.setValue(ent.getStatus());
return panel;
}
this.setBorder(border);
this.setText(" " +ent.getTitle() + " completed");
return this;
}
}
class ListEntity {
private String title;
private int status;
public ListEntity(String title) {
this.title = title;
status = 0;
}
public String getTitle() {
return title;
}
public synchronized void setStatus(int status) {
this.status = status;
if (this.status > 100)
this.status = 100;
}
public synchronized int getStatus() {
return this.status;
}
}
class DataLoader implements Runnable {
private List<ListEntity> list;
public DataLoader(List<ListEntity> list) {
this.list = list;
}
public void run() { //Hier werden die Daten abgearbeitet
for (ListEntity entity : list) {
int status;
while((status = entity.getStatus())<100) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
entity.setStatus(status + (int)(Math.random() * 30));
jList.repaint();
}
}
}
}
public static void main(String[] args) {
JFrame frame = new LoadingListDemo();
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}