Avatar billede trp79 Nybegynder
14. juni 2004 - 12:30 Der er 10 kommentarer og
2 løsninger

Gif filer i JList

Hejsa
Jeg har en JList, hvortil der er knyttet en defaultlistmodel. Jeg vil så gerne have et billede(gif) og til højre for det have tekst. Det har jeg gjort ved at bruge html:
model.addElement("<html><h3><img src=\"1.gif\">Infomeddelelse:    16/6-2004      Tavlemøde aflyst denne uge</h3></html>");

Men den vist bare et fejl billede i stedet for 1.gif. Kan man slet ikke gøre det på den måde? eller er det måske nærmere fordi jeg ikke har placeret min 1.gif det rigtige sted?

Mvh
Torben
Avatar billede knudx Nybegynder
14. juni 2004 - 12:34 #1
Hvis der bliver vist et fejlbillede må det jo være fordi den *prøver* at vise billedet, og så må det være placeringen af gif'en (eller stien i <img src>) den er gal med... Har du prøvet med en absolut sti (f.eks. file:/sti/paa/din/harddisk.gif) ???
Avatar billede trp79 Nybegynder
14. juni 2004 - 13:32 #2
Har lige prøvet med:
    model.addElement("<html><h3><img src=\"D:/jdev903/jdev/mywork/Eksamen/SBT/Run/1.gif\">Infomeddelelse:    16/6-2004      Tavlemøde aflyst denne uge</h3></html>");

Men desværre er resultatet det samme :(
Avatar billede Slettet bruger
14. juni 2004 - 15:29 #3
Prøv at tilføje denne custom ListCellRenderer-implementation til din JList:

package presentation;

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

public class MyListRenderer extends JPanel implements ListCellRenderer {
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if (value instanceof MyImageListObject) {
            MyImageListObject obj = (MyImageListObject)value;
           
            JLabel imagePnl = new JLabel();
            imagePnl.setIcon(new ImageIcon(getClass().getResource(obj.getImagePath())));
           
            setLayout(new BorderLayout());
            add(new JLabel(obj.getImageText()), BorderLayout.CENTER);
            add(imagePnl, BorderLayout.EAST);
        } else {
            setLayout(new BorderLayout());
            add(new JLabel(value.toString()), BorderLayout.CENTER);
        }
        return this;
    }
}
class MyImageListObject {
    private String imagePath;
    private String imageText;

    public MyImageListObject(String imagePath, String imageText) {
        this.imagePath = imagePath;
        this.imageText = imageText;
    }

    public String getImagePath() {
        return imagePath;
    }

    public String getImageText() {
        return imageText;
    }
}

Du må naturligvis kun putte MyImageListObject-instanser i listen såfremt du vil opnå at kunne se billede til højre og tekst til venstre.
Avatar billede Slettet bruger
14. juni 2004 - 15:30 #4
drop linien "package presentation;", jeg havde lige gang i et andet projekt i min IDE, hehe :-)
Avatar billede trp79 Nybegynder
14. juni 2004 - 16:02 #5
Hej Corholio.
Jeg har nu smidt den kode du har postet i en klasse. Derefter går jeg ud fra, at jeg skal sige:
private MyListRenderer listRenderer = new MyListRenderer();
...
jList1.setCellRenderer(listRenderer);

Men hvordan propper jeg så MyImageListObject'er i JListen? MyImageListObject er jo en inner class.

Håber du kan hjælpe mig lidt videre...

Mvh
Torben
Avatar billede Slettet bruger
14. juni 2004 - 16:17 #6
nej, det er bare en anonymous class, den kunne for så vidt laves public (i sin egen .java-fil).

Du laver blot instanser af MyImageListObject og tilføjer til din model, det er så simpelt.
Avatar billede trp79 Nybegynder
14. juni 2004 - 16:42 #7
Jeg ved ikke om jeg er helt blank, men jeg kan ikke helt få det til at fungerer når jeg siger model.addElement(new MyImageListObject("1.gif", "test test"));

Jeg får en unknown error in source. Det er en DefaultListModel, som jeg forsøger at tilføjge objektet til. Det skal det måske ikke være?
Avatar billede _carsten Nybegynder
14. juni 2004 - 17:26 #8
Jeg ville nok gøre det lidt anderledes, selvom idéen er den samme som corholio's
Prøv nedenstående eksempel, vender sandynligvis tilbage senere på aftenen.


import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.DefaultListModel;


public class Test extends javax.swing.JFrame {

    public Test() {
        String stiTilBillede = ""; // INDSÆT STI TIL BILLEDE
        initComponents();
        DefaultListModel model = new DefaultListModel();
        jList1.setCellRenderer(new MyListCellRenderer());
        jList1.setModel(model);
        model.addElement( new MyObject("Billede 1",
                          new javax.swing.ImageIcon( stiTilBillede )));
        model.addElement( new MyObject("Billede 2",
                          new javax.swing.ImageIcon( stiTilBillede )));
        model.addElement( new MyObject("Billede 3",
                          new javax.swing.ImageIcon( stiTilBillede )));
       
        setSize(250,250);
    }
   

    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jScrollPane1.setViewportView(jList1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new Test().show();
    }

    private javax.swing.JList jList1;
    private javax.swing.JScrollPane jScrollPane1;   
}





class MyListCellRenderer extends JLabel implements ListCellRenderer{
   
    public MyListCellRenderer() {
        super();
        setOpaque(true);
    }

    public java.awt.Component getListCellRendererComponent(JList jList,
                                                Object obj,
                                                int param,
                                                boolean isSelected,
                                                boolean cellFocus) {

        if (isSelected) {
              setBackground(jList.getSelectionBackground());
              setForeground(jList.getSelectionForeground());
        }
        else {
              setBackground(jList.getBackground());
              setForeground(jList.getForeground());
        }

        setIcon( ((MyObject)obj).getIcon() );
        setText( obj.toString());
       
        setFont(jList.getFont());

        return this;
    }
}






class MyObject {
    public MyObject() {
    }
   
    public MyObject(String text, ImageIcon icon) {
        this.text = text;
        this.icon = (Icon)icon;
    }
   
    public String toString(){
        return text;
    }
   
    public Icon getIcon(){
        return icon;
    }
   
    private Icon icon;
    private String text;
}
Avatar billede trp79 Nybegynder
15. juni 2004 - 12:37 #9
Det er super Carsten! Det virker jo perfekt :)
Hvis du også lige smider et svar, så smider jeg lidt flere point i pujlen, så du og corholio kan dele - jeres ideer bygger jo på samme princip som du siger.
Avatar billede _carsten Nybegynder
15. juni 2004 - 14:13 #10
Det kommer her.
Avatar billede trp79 Nybegynder
16. juni 2004 - 17:13 #11
Tak for hjælpen til jer begge,  mvh
Torben
Avatar billede Slettet bruger
16. juni 2004 - 19:11 #12
velbekomme, takker for point :-)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester