Avatar billede brinkoman Nybegynder
07. januar 2003 - 00:12 Der er 9 kommentarer og
1 løsning

JList celle-størrelse

Hej

Kan det ikke lade sig gøre at cellerne i en JList har forskellige størrelser?

Jeg har en ListCellRenderer som viser JEditorPane's i cellerne, og så vil jeg gerne have cellernes højde til at afhænge af indholdet i det JEditorPane som bliver vist i cellen.

Jeg håber der er nogen der kan hjælpe?
Avatar billede brinkoman Nybegynder
07. januar 2003 - 00:14 #1
Jeg har prøvet at sætte JEditorPane.fixedCellHeight() = -1, men så bliver cellen kun ca. 1 cm høj, og viser slet ikke hele JEditorPane-indholdet...
Avatar billede brinkoman Nybegynder
07. januar 2003 - 00:37 #2
Jeg har fundet ud af at man kan sætte højden på cellerne i ListCellRenderer med ...setPreferedSize(); men jeg kan ikke finde en metode til at se hvor meget et JEditorPane vil fylde i højden, med en bestemt html-text...

her er min ListCellRenderer-klasse:
---------------
import javax.swing.*;

public class HTMLListCellRenderer extends JComponent implements ListCellRenderer {
   
    public java.awt.Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
       
        JComponent theCell = (JEditorPane)value;
             
        if (isSelected) {
            theCell.setBackground(list.getSelectionBackground());
            theCell.setForeground(list.getSelectionForeground());
        }
        else {
            theCell.setBackground(list.getBackground());
            theCell.setForeground(list.getForeground());
        }
        theCell.setEnabled(list.isEnabled());
        theCell.setFont(list.getFont());
        //Det er linien nedenunder der skal finde JEditorPane'ets hoejde, og saette det ind i stedet for 100
        theCell.setPreferredSize(new java.awt.Dimension(list.getWidth(),100));
        return theCell;
    }
   
}
-----------
Avatar billede brinkoman Nybegynder
13. januar 2003 - 08:15 #3
Er der ikke nogen der ved noget om det??

Hvis det er fordi I ikke forstår hvad jeg spørger om, så bare spørg!
Avatar billede ulrikm Nybegynder
09. februar 2003 - 12:58 #4
Prøv med theCell.getPreferredSize().height
Avatar billede brinkoman Nybegynder
09. februar 2003 - 13:05 #5
hmmm... det forstår jeg ikke. Se på mit eksempel ovenover, da har jeg jo brugt theCell.setPreferedSize(), og der hvor der står 100 har jeg prøvet at skrive Dimension(list.getHeight())

I øvrigt er det lidt lang tid siden, og jeg har længe droppet det eftersom der ikke var nogen herinde der kunne hjælpe mig. Jeg troede ikke det kunne lade sig gøre, så jeg fandt en anden metode!
Avatar billede ulrikm Nybegynder
09. februar 2003 - 14:25 #6
Heh, jeg tror nu ikke at der er nogen grund til at sætte "preferred size" i det hele taget. Miseren skyldes nok at du tilføjer JEditorPane objekter direkte til listen. Herunder er et eksempel, hvor html strenge tilføjes til modellen og HTMLListCellRenderer bruges til at generere JEditorPane objekter som modellens data vises med. Den associerede ListUI sørger automatisk for at den rette højde bliver brugt (med mindre setFixedCellHeight() kaldes på JList):

import javax.swing.*;

public class LList
{

    public static void main( String[] args )
    {
        String htmlStr = "<html><body>hello1<p>hello2</body></html>";

        final JList list = new JList();
        // renderer med JEditorPanes som viser html'en fra modellen
        list.setCellRenderer( new HTMLListCellRenderer() );
        //til denne model tilføjes html formaterede strenge
        list.setModel( new DefaultListModel() );

        System.out.println( list.getUI() );

        //knap til at aktivere tilføjelse af "textArea"s indhold
        JButton addButton = new JButton("Add to list");
        final JTextArea textArea = new JTextArea(htmlStr);

        addButton.addActionListener
            (
                new java.awt.event.ActionListener()
                {
                    public void actionPerformed( java.awt.event.ActionEvent e )
                    {
                        // tilføj element til model
                        ((DefaultListModel)list.getModel()).addElement(textArea.getText());
                        System.gc();
                    }
                }
            );
        // yada yada yada - præsentation
        JFrame f = new JFrame();
        f.getContentPane().setLayout( new java.awt.BorderLayout() );
        f.getContentPane().add( new javax.swing.JScrollPane(list), java.awt.BorderLayout.NORTH );
        f.getContentPane().add( new javax.swing.JScrollPane(textArea), java.awt.BorderLayout.CENTER );
        f.getContentPane().add( addButton, java.awt.BorderLayout.SOUTH );
        f.pack();
        f.show();
    }

}


class HTMLListCellRenderer extends JComponent implements ListCellRenderer {
   
    // Der er ingen grund til at lave et nyt JEditorPane hver gang, så de gemmes her
    // læg dog mærke til at objekter skal fjernes igen fra denne manuelt (med remove()),
    // hvis der fjernes elementer fra modellen - ellers vil det være en kilde til memory
    // leak
    private static java.util.Hashtable editors = new java.util.Hashtable();

    public java.awt.Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
       
            // value er modellens value - altså en html formateret streng
        String theValue = (String)value;
          // theCell præsenterer html efter gældende regler
          JEditorPane theCell;
          // lav kun en ny JEditorPane, hvis der ikke allerede
          // eksisterer en for det givne index
          if( (theCell = (JEditorPane)editors.get(new Integer(index))) == null)
          {
              theCell = new JEditorPane();
            theCell.setContentType("text/html");
            editors.put( new Integer(index), theCell );
          }

          theCell.setText( (String)value );
             
        if (isSelected) {
            theCell.setBackground(list.getSelectionBackground());
            theCell.setForeground(list.getSelectionForeground());
        }
        else {
            theCell.setBackground(list.getBackground());
            theCell.setForeground(list.getForeground());
        }
        theCell.setEnabled(list.isEnabled());
        theCell.setFont(list.getFont());
        return theCell;
    }
   
}
Avatar billede ulrikm Nybegynder
09. februar 2003 - 14:29 #7
og hvorfor "editors" blev static ved jeg ikke - det skal den ikke (endnu større kilde til memory leaks)
Avatar billede brinkoman Nybegynder
09. februar 2003 - 17:09 #8
ok... det lyder rimelig fornuftigt.

Jeg må desværre tilstå at jeg ikke har tid til at prøve det af lige nu. Jeg fandt en anden løsning, og den er faktisk bedre ved nærmere eftertanke.

Men jeg vil med glæde give dig pointene, for jeg kommer med garanti til at bruge det en anden gang... og hvis det ikke virker, så kan tråden vel fortsætte på det tidspunkt!
Avatar billede brinkoman Nybegynder
09. februar 2003 - 17:20 #9
Nu kommer jeg lige til at se på din kode. Hvorfor har du brugt Hastable til at indeholde JEditorPane'ene? Kan du fortælle lidt om disse Hash-tabeller?
Avatar billede ulrikm Nybegynder
09. februar 2003 - 18:01 #10
Brugen af Hashtable var bare en nem måde at finde/gemme associationer mellem indexes i en list og JEditorPane objekter. Til et givet index hører et enkelt JEditorPane objekt - dette oprettes, hvis det ikke allerede findes. Hvis man opretter et JEditorPane hver gang listen skal gentegnes (og dermed at getListCellRendererComponent() kaldes), vil dette sløve gentegningen meget. Mere kan jeg ikke lige finde på at sige lige nu.
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