07. januar 2003 - 00:12Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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; }
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!
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):
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 ); }
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!
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.
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.