JList nimmt keine Selektierung mehr an

Status
Nicht offen für weitere Antworten.

milanwb

Aktives Mitglied
Hallo,

ich habe heute mal an meinem Programm ein paar Look And Feels ausprobiert.
Hierzu habe ich NUR 1 Zeile Code hinzugefügt: (UIManger.setLook......) - nichts anderes verändert!

Jetzt hatte ich ein schönes Look And Feel gefunden (Liquid LaF) und musste leider fest stellen, dass meine JList plötzlich keine Selektierung mehr annahm.
Also dachte ich, das LaF wär beschädigt, habe die oben genannte Zeile wieder entfernt und stellte mit erstaunen fest:

"Deine JList funktioniert nicht mehr..."

Ich also den PC neugestartet und es geht immer noch nicht... Jetzt frag ich mich warum funktioniert der Code, der es eben noch getan hat nicht mehr?

Vielleicht hat ja schon jemand ein ähnliches Problem gehabt und kann mir aus meiner Krise helfen 🙂

Oder war mein Code nur so schlecht, dass es nur ein Zufall war, dass er einmal lief?
Dazu hier einmal den Code der wichtigsten Elemente:

Die Funktion, die die Selektierung setzt:

Code:
// Vorwissen:
// in der ArrayList<Object> selectedNicks sind alle Positionen, die anschließend in der Liste angezeigt werden sollen gespeichert

     int arr[] = new int[selectedNicks.size()]; // Anlegen des nötigen int Arrays
            for (int a=0; a < selectedNicks.size();a++) { // durchlaufen aller Positionen
                arr[a] = ( (Integer)selectedNicks.get(a) ).intValue(); // Speichern in der positions Variabel
            }

            nicklist.setSelectedIndices(arr); // Alle Selektierungen anzeigen

Mein CellRenderer:

Code:
public NicklistRenderer() {}
    
    public Component getListCellRendererComponent(JList jlist, Object value, int index, boolean sec, boolean foc) {
        
        UserList list = (UserList)value; // Das in die JList eingefügte Object
        
        //System.out.println("Mod von: " + list.getNick() + " = " + list.getMod());
        
        if (list.getMod() != null) {
            setIcon(list.getMod());
        } 
        
        setFont(new Font("Arial", 1, 12));
        this.setText(list.getNick());
        
        if (list.getStatus() == 0)  {
            this.setForeground(Color.BLACK);
        } else if (list.getStatus() == 5) {
            this.setForeground(Color.GREEN);
        } else if (list.getStatus() >= 10) {
            this.setForeground(Color.RED);
        }
        
        return this;
    }


Ich hoffe jemand kann mir helfen, weil es ist schon ein sehr komischer Effekt find ich!
Solltet ihr noch mehr Teile haben wollen so sagt einfach bescheid 🙂

Grüße

Michael
... in Hoffnung auf schnelle Hilfe 🙂
 
tja, wer entsprechende Kenntnisse hat kommt vielleicht mit deinem Code aus,
für allgemeine Bastler wie mich solltest du aber ein komplett lauffähiges Testprogramm schreiben,
main, JFrame, JList, < 50 Zeilen

dabei so kurz wie möglich, selbst der Ausschnitt den du da gepostet hast läßt sich noch stark vereinfachen,
wen interessieren unterschiedliche Farben?
als Elemente der JList möglichst Strings oder ähnlich einfaches verwenden,
2-3 vordefnierte Testelemente reichen,
keine großen eigenen Klassen/ Ladeoperationen/ gar Benutzereingaben
 
Hi,


tja, wer entsprechende Kenntnisse hat kommt vielleicht mit deinem Code aus,
für allgemeine Bastler wie mich solltest du aber ein komplett lauffähiges Testprogramm schreiben,
main, JFrame, JList, < 50 Zeilen


hier das gewünschte Beispielprogramm:

Code:
package JListProb;

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

public class ListProblem {
    
    /** Creates a new instance of ListProblem */
    public ListProblem() {
        
        // Erstellen der nötigen Daten...
        
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
        Container c = f.getContentPane();
        c.setLayout(new BorderLayout());
        
        JList list = new JList();
        list.setPreferredSize(new Dimension(200,200));
        
        // Ab hier beginnt das Problem:
        
        
        /* Hiermit würde es funktionieren!
        
        Vector<String> daten = new Vector<String>();
        daten.add("Blaaa 1");
        daten.add("Blaaa 2");
        daten.add("Blaaa 3");
        
         */

        // Da ich aber einen eigenen Renderer verwende, muss es so sein:
        // Jetzt funktioniert keine Selektierung mehr.... (hat mal funktioniert)
        
        
        list.setCellRenderer(new NicklistRenderer());
        Vector<UserList> daten = new Vector<UserList>();
        daten.add(new UserList("Nummer 1", 0));
        daten.add(new UserList("Nummer 2", 5));
        daten.add(new UserList("Nummer 3", 10));

        
        
        // Einsetzen und Anzeigen des Fensters
        
        list.setListData(daten);
        
        c.add(list, BorderLayout.CENTER);
        
        f.pack();
        f.setVisible(true);
        
        
    }
    
    public static void main (String arg[]) {
        new ListProblem();
    }
}



class NicklistRenderer extends JLabel implements ListCellRenderer {
    
    public NicklistRenderer() {}
    
    public Component getListCellRendererComponent(JList jlist, Object value, int index, boolean sec, boolean foc) {
        
        UserList list = (UserList)value;
           
        setFont(new Font("Arial", 1, 12));
        this.setText(list.getNick());
        
        if (list.getStatus() == 0)  {
            this.setForeground(Color.BLACK);
        } else if (list.getStatus() == 5) {
            this.setForeground(Color.GREEN);
        } else if (list.getStatus() >= 10) {
            this.setForeground(Color.RED);
        }
        
        return this;
    }
    
}

class UserList {
    
    int status;
    String nick;    
    
    public UserList(String nick, int status) {
        this.status = status;
        this.nick = nick;
    }
    
    public String getNick() {
        return nick;
    }
    
    public int getStatus() {
        return status;
    }
    
}

Note: Ich verwende Java 1.5_10



wen interessieren unterschiedliche Farben?
als Elemente der JList möglichst Strings oder ähnlich einfaches verwenden,

Ich brauche leider die Farben und die Icons (habe diese jedoch jetzt mal im code gelöscht!) - Und genau dazu würde man diese CellRenderer verwenden wurde mir gesagt...

Nur wie gesagt das hat auch mal funktioniert, nur jetzt iwie nicht mehr... Die Frage ist warum? Muss ich vielleicht im CellRenderer etwas verändern?

Danke für eure Hilfe!

Grüße

Michael
 
Allgemeine Vorgehensweise bei derartigen Problemen.

1. Kopier deine Anwendung (Java-Files)
2. Reduzier' sie dermaßen, Schritt für Schritt, bis das
Problem nicht mehr auftritt, oder das Programm klein
genug zum Posten ist.

Und SlaterB hat Recht: Wen interessieren die Farben.

Nimm also erst mal den Code raus, solange er dein
eigentliches Problem nicht tangiert.
 
tja, ich verstehe so ein Problem einfach nicht 😉
erstmal hast du immer noch diese dumme UserListe,
kann man kinderleicht in drei Strings 1/2/3 ersetzen und genau den gleichen Effekt erzielen (statt nach Status direkt nach String unterscheiden)

aber die Farbe hat ja auch nix mit der Selektion zu tun, also löschen und alles schwarz,

so dann ist dein Problem irgendwas mit Selektion?
tja, dein Renderer enthält ja gar nix, was mit Selektion zu tun hat,
also einfach mal in google eintippen, in der API landen:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/ListCellRenderer.html
und das dortige Beispiel ganz oben klappt sofort ohne Probleme

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

public class ListProblem {

	public ListProblem() {
		JList list = new JList();
		list.setPreferredSize(new Dimension(200, 200));
		list.setCellRenderer(new NicklistRenderer());

		Vector daten = new Vector();
		daten.add("1");
		daten.add("2");
		daten.add("3");
		list.setListData(daten);

		JFrame f = new JFrame();
		f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
		f.getContentPane().add(list, BorderLayout.CENTER);
		f.pack();
		f.setVisible(true);
	}

	public static void main(String arg[]) {
		new ListProblem();
	}
}

class NicklistRenderer extends JLabel implements ListCellRenderer {

	public NicklistRenderer() {
		setOpaque(true);
	}

	public Component getListCellRendererComponent(
		JList jlist, Object value, int index, boolean sec, boolean foc) {

		String item = (String) value;

		setFont(new Font("Arial", 1, 12));
		this.setText(item);
		setBackground(sec ? Color.red : Color.white);
		setForeground(sec ? Color.white : Color.black);

		return this;
	}
}

und was ist nun dein Problem?
 
Hallo,

Ich habe meinen Code mal an deinen angepasst! Hat super geklappt warum war ich nur so dumm und hab das setBackground übersehen...
Nur daran hat ich gar nicht gedacht, weil es ja bevor ich mit den LaF's rumgespielt habe alles geklappt hat... Es wird wohl ein Rätzel bleiben...

----

Zum Thema UserList:

Das habe ich wegen diesem Thread gemacht: www.java-forum.org/de/viewtopic.php?t=2232&highlight=cellrenderer+jlist

Also meinst du es ist besser folgendes zu machen:

Code:
// Im Aufbau:

Vector<String> daten = new Vector<String>();
daten.add("Anzeige1#5#icontyp");
daten.add("Anzeige2#0#icontyp");
daten.add("Anzeige3#10#icontyp");

list.setListData(daten);

// Im Renderer:

Icon typ1, typ2;

public NicklistRenderer() {
setOpaque(true);
typ1 = new ImageIcon("...");
typ2 = new ImageIcon("...");
}


public Component getListCellRendererComponent(...) {


String split[] = value.toString().split("#");

// Text

setText(split[0]);

// Farbe

int status = Integer.parseInt(split[1]);

if (status == 0) {
setForeground(Color.BLACK);
} else if (status > 10) {
setForeground(Color.RED);
} else if (status == 5) {
setForeground(Color.BLUE)

// Icon

if (split[2].equals("type1")) {
setIcon(typ1);
}

setBackground(...);


}

Vielen Dank für deine Hilfe! Hast mir sehr geholfen 🙂


EDIT:

P.S.: Hatte das mit den Farben eben falsch verstanden - ich dachte ich sollte keine Farben in meinem fertigen Programm verwenden... - hatte das gar nicht auf das Beispielprog bezogen!
 
sowohl bei Farben als auch bei den Daten ging es mir nur um das Testprogramm,
Fehlerquellen analysieren, herausstellen usw.,

im fertigen Programm kann ich dir nur empfehlen, das Vorgehen mit der UserListe weiter zu verfolgen,
sehr löblich,
nur im Zusammenhang mit diesem Problem verwirrender Ballast 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben