Swing Dynamische JList mit Bildern

Beatsleigher

Bekanntes Mitglied
Halli, Hallo!

Ich möchte in meinem Programm eine dynamische Liste haben, in der Spieler gelistet werden, die online sind.
Wenn diese online sind, soll ein Sternchen als Bild dahin, wenn diese jedoch AFK sind, soll ein Sternchen "ohne Funkeln" dahin.

Online: player_online.png
AFK: player_afk.png

Nun, ich habe ein wenig im Land des Google nachgeforscht, und bin auf dieses Thema bei Stackoverflow gestoßen. Der Ansatz ist schon mal der, den ich haben will. Nun kann ich mir aber beim besten Willen nicht vorstellen, wie ich das dynamisch machen soll.

Ich wollte schon ein bisschen mit einer Hashmap probieren, wo dann <String, Boolean> drin enthalten ist, jedoch komme ich immer wieder vom Faden und meine Ansätze lösen sich in Luft auf.

Zumal das alles quasi in Echtzeit abläuft.

Habt ihr Ideen, wie es zu machen sein könnte? Danke schonmal im Voraus!
 

dzim

Top Contributor
Leider nicht mit Swing... Mit JavaFX wäre es mittels Databinding recht einfach - da müsste nur das Model geupdated werden und das Binding updated sozusagen das Icon. Aber ich denke, dass du so etwas ähnliches auch mit Swing hinbekommst, indem du diesen CellRenderer oder wie er hiess implementierst und irgendwie mit deinem Modell verbindest (PropertyChangeListener vielleicht? Oder gibt es Databinding-Frameworks für Swing?). Musst halt mal schauen, aber der Ansatz mit dem Binding wäre dein einzuschlagender Weg...
 

Flown

Administrator
Mitarbeiter
Also ich habe das mal gefunden. Ein Tutorial zum erstellen einer JList mit einem Icon;. Wenn du dann dein Icon "updatest" kannst du ja dein Model updaten und mithilfe von Listener das Icon neu setzen und neu zeichnen lassen.
 

Beatsleigher

Bekanntes Mitglied
Danke schon mal. Ich benutze eine customListCellRenderer, aber ich habe immernoch keine Ahnung, wie das ganze updaten soll...

Hier ist noch ein bisschen Code. Vielleicht liege ich ja schon auf dem richtigen Wege, merke es aber einfach nicht...
Java:
//========== Player Management ==========\\
    
    private Map<String, ImageIcon> createPlayerImageMap() {
        Map<String, ImageIcon> map = new HashMap<>();
        try {
            for (Player player : listOfPlayers) {
                if (player.isAFK()) {
                    map.put(player.toString(), new ImageIcon(this.getClass().getResource("/eu/m4gkbeatz/bukkitui/resources/player_icons/player_afk.png")));
                } else {
                    map.put(player.toString(), new ImageIcon(this.getClass().getResource("/eu/m4gkbeatz/bukkitui/resources/player_icons/player_online.png")));
                }
            }
        } catch (Exception ex) {}
        return map;
    }
    
    private void loadPlayers() {
        DefaultListModel model = new DefaultListModel();
        int index = 0;
        for (Player player : listOfPlayers) {
            model.add(index, player.toString());
            index++;
        }
    }

//========== Internal Classes ===========\\    
    /**
     * Custom list cell renderer for player list.
     * @author beatsleigher
     */
    public class PlayerListCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            label.setIcon(imageMap.get((String) value));
            label.setHorizontalTextPosition(JLabel.RIGHT);
            return label;
        }

    }

//========== Read Console Output ===========\\

    private void monitorServer() {
        new Thread() {
            @Override
            public void run() {
                try {
                    String line = "";
                    while ((line = processReader.readLine()) != null && runServer) {
                        if (!line.contains("[JVM]")) {
                            consoleLog.append(line + "\n");
                            System.out.print("Craftbukkit Output: " + line + "\n");
                            if (line.toLowerCase().contains("done")) {
                                serverStatusLabel.setIcon(ONLINE);
                                serverStatusLabel.setText("ONLINE");
                                serverState = ServerState.ONLINE;
                                monitorServerRuntime();
                            }
                            if (line.toLowerCase().contains("logged in")) {
                                String[] arr = line.split("[INFO] "), arr0 = arr[1].split(" ");
                                String[] ip0 = arr0[1].split("[/"), ip1 = ip0[1].split("]");
                                System.out.println("User logged in: " + arr0[0]);
                                System.out.println("User IP-Address: " + ip1[0]);
                                listOfPlayers.add(new Player(arr0[0], false, ip1[0])); 
                            }
                            if (line.toLowerCase().contains("disconnect.")) {
                                String[] arr = line.split("[INFO] "), arr0 = arr[1].split(" ");
                                System.out.println(arr0[0] + " has left.");
                                for (Player player : listOfPlayers) {
                                    if (player.toString().equals(arr0[0]))
                                        listOfPlayers.remove(player);
                                }
                            }
                            imageMap = createPlayerImageMap();
                            loadPlayers();
                            
                        } else {
                            if (line.contains("processCPULoad=")) {
                                System.out.println("JVM Info: " + line);
                                String[] load = line.split("=");
                                cpuUsageProgressBar.setValue(Integer.valueOf(load[1]));
                                cpuUsageProgressBar.setString(load[1]);
                                continue;
                            }
                            if (line.contains("maxMem=")) {
                                String[] mem = line.split("=");
                                System.out.println("JVM Info: " + line);
                                maxMemLabel.setText("Max Memory: " + mem[1] + "MB");
                                usedMemProgressBar.setMaximum(Integer.valueOf(mem[1]));
                            }
                            if (line.contains("totalMem=")) {
                                String[] mem = line.split("=");
                                System.out.println("JVM Info: " + line);
                                totalMemLabel.setText("Total Memory: " + mem[1] + "MB");
                            }
                            if (line.contains("usedMem=")) {
                                String[] mem = line.split("=");
                                System.out.println("JVM Info: " + line);
                                usedMemProgressBar.setString("used Memory: " + mem[1] + "MB");
                                usedMemProgressBar.setValue(Integer.valueOf(mem[1]));
                            }
                            
                        }
                    }
                    serverStatusLabel.setIcon(OFFLINE);
                    serverStatusLabel.setText("OFFLINE");
                } catch (Exception ex) {
                    serverStatusLabel.setIcon(OFFLINE);
                    JOptionPane.showMessageDialog(null, "ERROR: An error occured while trying to read from the server!\n" + ex.toString() + "\nThe server will now be destroyed.", "Destroying Process!", JOptionPane.ERROR_MESSAGE);
                    killServer();
                }
            }
        }.start();
    }
 
Zuletzt bearbeitet:

Beatsleigher

Bekanntes Mitglied
Ok. Ich bin wirklich doof. Ich hatte die ganze Zeit die Lösung hier gepostet.
Trotzdem danke an alle, die hier gepostet haben :)

Java:
    /**
     * Custom list cell renderer for player list.
     * Die Klasse, die als Renderer verwendet wird.
     * @author beatsleigher
     */
    public class PlayerListCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            label.setIcon(imageMap.get((String) value));
            label.setHorizontalTextPosition(JLabel.RIGHT);
            return label;
        }

    }

  //========== Player Management ==========\\
   // Objekte in die Liste einfügen und dann eine Hashmap mit den gewünschten Werten erzeugen...
    
    private Map<String, ImageIcon> createPlayerImageMap() {
        Map<String, ImageIcon> map = new HashMap<>();
        try {
            for (Player player : listOfPlayers) {
                if (player.isAFK()) {
                    map.put(player.toString(), new ImageIcon(this.getClass().getResource("/eu/m4gkbeatz/bukkitui/resources/player_icons/player_afk.png")));
                } else {
                    map.put(player.toString(), new ImageIcon(this.getClass().getResource("/eu/m4gkbeatz/bukkitui/resources/player_icons/player_online.png")));
                }
            }
        } catch (Exception ex) {}
        return map;
    }
    
    private void loadPlayers() {
        DefaultListModel model = new DefaultListModel();
        int index = 0;
        for (Player player : listOfPlayers) {
            model.add(index, player.toString());
            index++;
        }
        playerList.setModel(model);
    }

   // Objekte aus der Liste von Objekten löschen/Objekte in die Liste einfügen
   
  private void monitorServer() {
        new Thread() {
            @Override
            public void run() {
                try {
                    String line = "";
                    while ((line = processReader.readLine()) != null && runServer) {
                        if (!line.contains("[JVM]")) {
                            consoleLog.append(line + "\n");
                            System.out.print("Craftbukkit Output: " + line + "\n");
                            if (line.toLowerCase().contains("done")) {
                                serverStatusLabel.setIcon(ONLINE);
                                serverStatusLabel.setText("ONLINE");
                                serverState = ServerState.ONLINE;
                                monitorServerRuntime();
                            }
                            if (line.toLowerCase().contains("logged in")) {
                                String[] arr = line.split("\\[INFO] ");
                                String[] arr0 = arr[1].split(" ");
                                String[] ip0 = arr0[1].split("\\[/"), ip1 = ip0[1].split("]");
                                System.out.println("User logged in: " + arr0[0]);
                                System.out.println("User IP-Address: " + ip1[0]);
                                listOfPlayers.add(new Player(arr0[0], false, ip1[0])); 
                            }
                            if (line.toLowerCase().contains("disconnect.")) {
                                String[] arr = line.split("\\[INFO] "), arr0 = arr[1].split(" ");
                                System.out.println(arr0[0] + " has left.");
                                for (int i = 0; i < listOfPlayers.size(); i++) {
                                    if (listOfPlayers.get(i).toString().equals(arr0[0])) {
                                        listOfPlayers.remove(i);
                                        break;
                                    }
                                }
                            }
                            imageMap = createPlayerImageMap();
                            loadPlayers();
                            playerList.setCellRenderer(new PlayerListCellRenderer());
                            
                        } else {
                            if (line.contains("processCPULoad=")) {
                                System.out.println("JVM Info: " + line);
                                String[] load = line.split("=");
                                cpuUsageProgressBar.setValue(Integer.valueOf(load[1]));
                                cpuUsageProgressBar.setString(load[1]);
                                continue;
                            }
                            if (line.contains("maxMem=")) {
                                String[] mem = line.split("=");
                                System.out.println("JVM Info: " + line);
                                maxMemLabel.setText("Max Memory: " + mem[1] + "MB");
                                usedMemProgressBar.setMaximum(Integer.valueOf(mem[1]));
                            }
                            if (line.contains("totalMem=")) {
                                String[] mem = line.split("=");
                                System.out.println("JVM Info: " + line);
                                totalMemLabel.setText("Total Memory: " + mem[1] + "MB");
                            }
                            if (line.contains("usedMem=")) {
                                String[] mem = line.split("=");
                                System.out.println("JVM Info: " + line);
                                usedMemProgressBar.setString("used Memory: " + mem[1] + "MB");
                                usedMemProgressBar.setValue(Integer.valueOf(mem[1]));
                            }
                            
                        }
                    }
                    serverStatusLabel.setIcon(OFFLINE);
                    serverStatusLabel.setText("OFFLINE");
                    serverState = ServerState.OFFLINE;
                } catch (Exception ex) {
                    serverStatusLabel.setIcon(OFFLINE);
                    serverStatusLabel.setText("OFFLINE: ERROR");
                    serverState = ServerState.OFFLINE;
                    JOptionPane.showMessageDialog(null, "ERROR: An error occured while trying to read from the server!\n" + ex.toString() + "\nThe server will now be destroyed.", "Destroying Process!", JOptionPane.ERROR_MESSAGE);
                    System.err.println("ERROR: An error occured while trying to read from the server!\n" + ex.toString() + "\nThe server will now be destroyed.");
                    ex.printStackTrace(System.err);
                    killServer();
                }
            }
        }.start();
    }

Endergebnis: BukkitUI_PlayerLoggedOn.jpg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
M Dynamische Zellengröße und Zeilenumbruch AWT, Swing, JavaFX & SWT 7
M Java FX dynamische Diagramme AWT, Swing, JavaFX & SWT 0
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
4a61766120617274697374 dynamische Tree View AWT, Swing, JavaFX & SWT 2
P JavaFX Dynamische TableView AWT, Swing, JavaFX & SWT 14
G Dynamische ComboBox AWT, Swing, JavaFX & SWT 3
S Jtable dynamische Spaltenbreite AWT, Swing, JavaFX & SWT 5
B SWT Dynamische GUI (Layoutmanager?) AWT, Swing, JavaFX & SWT 2
P Dynamische Seite zum basteln für den User AWT, Swing, JavaFX & SWT 8
B SWT TreeViewer dynamische Anzeige von Icons AWT, Swing, JavaFX & SWT 3
J Java - dynamische Anpassung an Fenstergröße? AWT, Swing, JavaFX & SWT 4
B Swing Dynamische JMenuBar AWT, Swing, JavaFX & SWT 2
C Swing Dynamische JComboBox (Filter) AWT, Swing, JavaFX & SWT 28
W "Dynamische JComboBoxes" AWT, Swing, JavaFX & SWT 5
N Swing Dynamische Controls AWT, Swing, JavaFX & SWT 5
C JTable dynamische erweitern AWT, Swing, JavaFX & SWT 2
T 2D-Grafik Statisches Hintergrundbild, dynamische Bilder drüber AWT, Swing, JavaFX & SWT 2
N Dynamische JFreechart updated UI nicht AWT, Swing, JavaFX & SWT 5
G Große dynamische ContextMenus erzeugen (Eclipse RCP) AWT, Swing, JavaFX & SWT 4
F Swing Dynamische Größenanpassung AWT, Swing, JavaFX & SWT 4
trash Dynamische JTable (SQL) AWT, Swing, JavaFX & SWT 5
L Dynamische Textgröße bei Buttons AWT, Swing, JavaFX & SWT 3
lordcarlos Dynamische und interaktive grafik AWT, Swing, JavaFX & SWT 5
T Swing JTable dynamische Zeilenhöhe AWT, Swing, JavaFX & SWT 5
U Dynamische Panel hinzufügen AWT, Swing, JavaFX & SWT 6
N Swing Dynamische JRadioButtons und Visual Editor AWT, Swing, JavaFX & SWT 4
Q Dynamische Zahl und Positionierung von Objekten AWT, Swing, JavaFX & SWT 5
S Swing Dynamische JPanels: Vertikales Strecken verhindern AWT, Swing, JavaFX & SWT 4
hdi dynamische Iteration über Components AWT, Swing, JavaFX & SWT 3
E Dynamische JComboBox AWT, Swing, JavaFX & SWT 3
F dynamische Ausgabe eines extenen Programms umleiten AWT, Swing, JavaFX & SWT 6
F Dynamische Swing Elemente AWT, Swing, JavaFX & SWT 10
G Dynamische JMenuBar AWT, Swing, JavaFX & SWT 2
T Dynamische Anpassung einer jCheckBox AWT, Swing, JavaFX & SWT 11
O Bindings, dynamische Verbindung (Vorbau mit Netbeans) AWT, Swing, JavaFX & SWT 10
G Dynamische Menüs mit Liste von MRU Dateien AWT, Swing, JavaFX & SWT 2
X Dynamische linien (Position und Länge) AWT, Swing, JavaFX & SWT 4
L Dynamische Buttons erstellt, aber wie ein Event zuweisen? AWT, Swing, JavaFX & SWT 11
T dynamische anzeige? AWT, Swing, JavaFX & SWT 4
S Dynamische Ausgabe im JTextField AWT, Swing, JavaFX & SWT 7
K dynamische jlabels AWT, Swing, JavaFX & SWT 21
M dynamische Grafik in JFrame einbetten AWT, Swing, JavaFX & SWT 2
G JTable dynamische Darstellung der ankommenden Daten AWT, Swing, JavaFX & SWT 19
G JTextField & Dynamische Grössenänderung? AWT, Swing, JavaFX & SWT 8
K TableLayout - dynamische Elemente zu spät ge-updated AWT, Swing, JavaFX & SWT 3
O Dynamische Checkboxen AWT, Swing, JavaFX & SWT 21
T Dynamische GUI's AWT, Swing, JavaFX & SWT 10
T Dynamische Look&Feels AWT, Swing, JavaFX & SWT 4
K dynamische Bilder laden AWT, Swing, JavaFX & SWT 5
B Jlist füllen AWT, Swing, JavaFX & SWT 4
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
J JList scrollen AWT, Swing, JavaFX & SWT 3
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
F JList bei Windowbuilder AWT, Swing, JavaFX & SWT 8
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
P JList erstellen AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
P Übergeben von ListModel an nichtparametrisierte JList AWT, Swing, JavaFX & SWT 8
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
T Swing WindowBuilder: JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JList wird angezeigt, JTable (DefaultTableModel) nicht AWT, Swing, JavaFX & SWT 7
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
S JList repaint AWT, Swing, JavaFX & SWT 1
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
H JList AWT, Swing, JavaFX & SWT 5
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
S JList Index finden AWT, Swing, JavaFX & SWT 6
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
B Tabelleneinträge in JList anzeigen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben