Hi,
ich wollte für mein Programm ein Statusfenster erstellen, in dem Nachrichten eingeblendet werden + einem dazugehörigen Icon, also "INFOICON Programm erfolgreich gestartet" etc. Ihr wisst vermutlich was ich meine.
Ich hab mir dafür ein eigenes ListenModel (implementiert das Interface ListModel) erstellt sowie einen eigenen ListenRenderer (implementiert das Interface ListCellRenderer). Folgend sind die beiden Klassen mal aufgelistet:
Model:
ListRenderer:
Dem Model werden Werte dann wie folgt hinzugefügt:
Wenn ich dem Model jetzt aber z.b. 60 Werte übergebe, verbraucht die JVM ca 77MB. Wenn ich nichts hinzufüge, beansprucht die irgendwas mit 38MB.
Die wird vermutlich so viel verbrauchen weil ich jedesmal ein HashMap-Objekt übergebe. Eine Stauszeile wird immer hinzugefügt wenn ein Event ausgelöst wird.
Gibt es für mein Vorhaben also eine elegenatere Lösung?
ich wollte für mein Programm ein Statusfenster erstellen, in dem Nachrichten eingeblendet werden + einem dazugehörigen Icon, also "INFOICON Programm erfolgreich gestartet" etc. Ihr wisst vermutlich was ich meine.
Ich hab mir dafür ein eigenes ListenModel (implementiert das Interface ListModel) erstellt sowie einen eigenen ListenRenderer (implementiert das Interface ListCellRenderer). Folgend sind die beiden Klassen mal aufgelistet:
Model:
Java:
class MyStatusListModel implements ListModel {
private Vector<Map<String, String>> maps = new Vector<Map<String, String>>();
private Vector<ListDataListener> listeners = new Vector<ListDataListener>();
public void addObject(Map<String, String> img) {
int index = maps.size();
maps.add(img);
ListDataEvent e = new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index);
for (int i = 0, n = listeners.size(); i < n; i++) {
((ListDataListener) listeners.get(i)).contentsChanged(e);
}
}
public void clear() {
maps.clear();
}
@Override
public void addListDataListener(ListDataListener arg0) {
listeners.add(arg0);
}
@Override
public Object getElementAt(int arg0) {
Map<String, String> map = (Map<String, String>) maps.get(arg0);
return map;
}
@Override
public int getSize() {
return maps.size();
}
@Override
public void removeListDataListener(ListDataListener arg0) {
listeners.remove(arg0);
}
}
ListRenderer:
Java:
class IconListRenderer implements ListCellRenderer {
private Map<String, Icon> icons = null;
private JLabel label = new JLabel();
private Map<String, String> val;
public IconListRenderer(Map<String, Icon> icons) {
this.icons = icons;
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
// Get icon to use for the list item value
val = (Map<String, String>) value;
Icon icon = null;
if (val.containsKey("added")) {
icon = icons.get("added");
label.setText(val.get("added").toString());
} else if (val.containsKey("info")) {
icon = icons.get("info");
label.setText(val.get("info").toString());
} else if (val.containsKey("error")) {
icon = icons.get("error");
label.setText(val.get("error").toString());
} else if (val.containsKey("alert")) {
icon = icons.get("alert");
label.setText(val.get("alert").toString());
} else if (val.containsKey("folder")) {
icon = icons.get("folder");
label.setText(val.get("folder").toString());
}
// Set icon to display for value
label.setIcon(icon);
val = null;
icon = null;
return label;
}
}
Dem Model werden Werte dann wie folgt hinzugefügt:
Java:
Map<String, String> icons = new HashMap<String, String>(1);
icons.put("info", "Programm erfolgreich gestartet...");
statusListModel.addObject(icons);
Die wird vermutlich so viel verbrauchen weil ich jedesmal ein HashMap-Objekt übergebe. Eine Stauszeile wird immer hinzugefügt wenn ein Event ausgelöst wird.
Gibt es für mein Vorhaben also eine elegenatere Lösung?