ArrayList grafisch darstellen (mit Bild, ListCellRenderer?)

Hallo,

Ich habe hier wie man sieht 2 Klassen. In Klasse 2 soll man anhand des bildes werte eingeben können. Diese werden auch als ArrayList gespeichert.

Nun habe ich das problem das ich absolut keine ahnung habe, wie ich die ArrayList wie im Bild dargestellt, mit Bild und den entsprechenden Werten in der JList darstellen kann. Außerdem möchte ich bei jedem Bild einen JButton einfügen der beim betätigen das entsprechende Element, löscht.

Habe schon viel gelesen von dem ListCellRenderer und eigener JComponenten…habe mir auch Tutorials usw. dazu angesehen…blicke aber einfach nicht durch :wink:

Wäre sehr cool wenn mir jemand erklären könnte wie ich das Lösen kann.

Mfg

Der Link geht bei mir nicht. Ich bekomme folgende Fehlermeldung:

Die Grafik „http://www7.pic-upload.de/02.08.13/37uk1huu23m.jpg“ kann nicht angezeigt werden, weil sie Fehler enthält.

Hallo tomha,

bei mir funktioniert der Link zum Bild ebenfalls nicht.
Ich bekomme die selbe Fehlermeldung wie Natac.

MfG
hansmueller

http://s1.directupload.net/images/130802/emeldjen.jpg

kannst du nicht einfach ein Panel mit dem passenden Bild als Hintergrund nehmen und die werte dann per JLabel drüber schreiben?

Hier mal ein Quick’n-Dirty Beispiel wie du mit einem cell-renderer

package de.jfruit;

import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;

public class SampleRenderer {

    public static void main(String[] args) {
        final JFrame frame = new JFrame("Sample Renderer");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JList list = new JList();

        DefaultListModel model = new DefaultListModel();
        model.addElement(Arrays.asList("Karl", "heiner", "abc"));
        model.addElement(Arrays.asList("def", "k"));
        list.setCellRenderer(new MyListRenderer());
        list.setModel(model);

        frame.add(list);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setLocationRelativeTo(null);
                frame.setSize(600, 300);
                frame.setVisible(true);
            }
        });
    }
}


class MyListRenderer extends DefaultListCellRenderer {
    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if(!(value instanceof List)) return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        List liste = (List) value;

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0,2));

        for(int i = 0; i < liste.size(); i++) {
            panel.add(new JLabel("Eintrag: " + i));
            panel.add(new JLabel(liste.get(i).toString()));
        }

        if(index % 2 == 0) {
            panel.setBackground(Color.CYAN);
        }

        return panel;
    }
}

Hm hilft mir nicht wirklich weiter, da ich wie gesagt noch nie damit gearbeitet habe. Nicht böse gemeint aber sagen wir es so. Bin froh das ich das Zweite Semester mit Java geschafft habe :smiley:

Vielleicht mag jemand so nett sein und mir das implementieren, wenn ich ihm alles schicke? :smiley:

Ansonsten wäre eine kleine anleitung cool.
Was muss ich zuerst machen? Wie bekomme ich die Daten von der ArrayList in die JList (DefaultListModel!?)…wie verwende ich den CellRenderer?

Tut mir wirklich leid aber ich sitze schon den halben Tag am Rechner und versuche das zu verstehen :smiley:

Vielleicht mag mir jemand über Skype helfen?

LG,

und trotzdem danke für die antworten.

Vielleicht müßtest du auch etwas konkreter werden… Es gibt ja sowas wie http://docs.oracle.com/javase/tutorial/uiswing/components/list.html , wenn man sich das grob durchliest und die Beispiele ausprobiert sollten sich viele der ersten Fragen schon klären.

@Tomate_Salat : Bei so einem Renderer sollte man die zurückgegebene Component i.a. nicht bei jedem Rendern neu erstellen. Die wird eher wie ein “Stempel” benutzt -also die selbe immer wieder neu gefüllt. Aber hier ist das vielleicht noch nicht sooo wichtig.

@tomha : so wissen wir ehrlich gesagt nicht, wie wir dir helfen sollen. Du kannst ja mal mit dem kskb experimentieren — vllt wird dann einiges klarer.

@Marco13 : jo eigentlich schon. Ich würde mal sagen mit QnD hab ich das Beispiel sehr gut beschrieben :o)

kskb?

Kurzes selbstkompilierendes Beispiel

Wenn ich dich richtig verstehe thoma, dann möchtest du nicht nur die Komponente rendern, sondern auch noch die Funktionalität des JButtons wahren. Da würde sich eher ein JTable mit nur einer Spalte anbieten, damit währe das einfacher möglich. JList+Renderer ist da nich so die treffende Wahl.

Gruß Vanny

Buttons in einer JTable sind IMHO auch ein Krampf. Ich hatte schon im anderen Forum gesagt (und sage hier nochmal) dass mir nicht einleuchtet, warum man das nicht einfach mit ein paar selbstgebauten Components macht, aber es weiß eben auch niemand, was genau das am Ende werden soll…

Also ich habe jetzt mal einen JTable mit dummy daten erstellt. Gefällt mir schon ganz gut soweit…nur wie fülle ich jetzt meinen dynamisch wachsenden array (ArrayList) in den JTable? Meine ArrayList befindet sich in einer anderen Klasse.

Wenn ich nun ein neues Objekt der Klasse erzeuge um auf die ArrayList zu zugreifen, wird die Klasse nicht mehr dargestellt.

GUI Klasse (Klasse mit dem JTable)

NeuHardwareFenster Klasse (Fenster was sich öffnet um neues PC Hardware zu erstellen mit ArrayList).

habe in der hauptklasse (GUI) folgendes erstellt.


public class GUI()
{
      jlabels usw....
      NeuHardwareFenster neuFenster;

      public GUI()
      {
            jlabels usw...
            guiErstellen(); // Erstellt das GUI...
            neuFenster = new NeuHardwareFenster();
       }
}

gibt es eine andere möglichkeit auf das Array der anderen klasse zu zugreifen?
damit ich es dem JTable hinzufügen kann?

[QUOTE=tomha]gibt es eine andere möglichkeit auf das Array der anderen klasse zu zugreifen?
damit ich es dem JTable hinzufügen kann?[/QUOTE]
Eine andere Möglichkeit als was?

Man kann sich ein eigenes TableModel definieren, welches die ArrayList direkt nutzt - ohne Umweg über Array oder Vector. Davon abgesehen ist ein eigenes TableModel ohnehin gängige Praxis.