10. december 2001 - 22:49Der er
6 kommentarer og 1 løsning
DefaultListModel / ListCellRenderer
Hejsa,
Jeg har brug for at tilføje et billede eller ændre baggrundsfarven for et index[n]i en JList i runtime. Dvs. at på en button_event skal et givet index[n] ændre baggrundsfarve eller indsætte et ikon.
Jeg er i tvivl om det er CellRenderer eller ListModel jeg skal have fat i. Så vidt jeg kan forstå, er det ListModel der styrer indholdet af listen.
Er der en der ved dette, og som lige kan give et hurtigt eksempel.
Din ListModel holder data, din Renderer viser dem.
Dvs. du skal have en listmodel, som ved hvilke elementer, som skal være anderledes, ala:
class MyData { public boolean selected; public String someText; public MyData(boolean selected, String text) { this.selected = selected; this.someText = text; } }
class MyListModel extends AbstractTableModel { private MyData[] data = { new MyData(true, \"Hej\"), new MyData(false, \"Verden\") }; public int getSize() { return data.length; }
public int getElementAt(int index) { return data[index] } }
Eksemplet ovenover er selvfølgelig meget forsimplet, men jeg har en ListModel, som bruger objekter der indeholder de data, som jeg finder nødvendige i en sammenhæng.
Når en liste tegnes, bruges en ListCellRenderer til at repræsentere hvert element. Hvis du skal have noget ændret grafisk, skal du pille ved denne.
Et eksempel (Som sætter baggrundsfarven for de objekter af typen MyData hvor selected er true).
public class MyRenderer extends DefaultListCellRenderer { public MyRenderer() { setOpaque(true); }
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); // Do as we always do initially
if (value instanceof MyData) { // If we need to do it differently MyData d = (MyData) value; setText(d.someText); if (d.selected) setBackground(Color.cyan); else setBackground(Color.white); } } }
Add denne renderer til din list, og brug din nye listmodel, så skulle det virke.
Din model indeholder ikke nogen oplysninger om at noget er \"valgt\", der er nærmest bare en ombrudt String.
Din Renderer ser fin nok ud. Det du skal huske på er, at den ikke eksisterer på grænsefladen som sådan, den bliver kaldt af din liste når den skal tegne nogle ting.
Når du siger listModel.getElementAt(listMenu.getSelectedIndex()); Får du et af dine elementer (Som du har added, og som er Strings) fra modellen, og det er derfor ikke JTextArea komponenter.
Det er et spørgsmål om at din list model er for \"tynd\", og ikke kan indeholde oplysninger om hvilke elementer der skal have en særlig baggrund.
Jeg ville personligt gøre Lave en lidt \"bedre\" model, og bruge i stedet, og så rette rendereren lidt til.
Følgende virker!!!:
En Ny ListModel: class MyDefaultModel extends DefaultListModel { class MyData { public boolean selected; public String value; public MyData(String value) { this.value = value; } public String toString() {return value;} }
public void addElement(String data) { super.addElement(new MyData(data)); }
Tak for hjælpen, de 60 point er dine - du har fortjent dem :-)
Mvh Tonni
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.