2011-11-19 33 views
8

Tengo un JList con nombres de elementos muy largos que hacen que la barra de desplazamiento horizontal aparezca en el panel de desplazamiento.Recorte de palabras en los artículos de la Lista J

¿Hay algún modo en que pueda ajustar las palabras para que todo el nombre del elemento aparezca en 2 filas y se pueda seleccionar con un solo clic? I.E todavía debe comportarse como un único elemento pero ser visualizados en dos filas.


Aquí es lo que hice después de ver el siguiente ejemplo

he añadido una nueva clase de mi proyecto MyCellRenderer y luego me fui añadido MyList.setCellRenderer(new MyCellRenderer(80)); en el código de creación de puesto de mi lista. ¿Hay algo más que deba hacer?

+4

Utilice un procesador de celdas personalizado. –

+0

Me parece recordar a alguien (fue Andrew) usando un JLabel, HTML y hojas de estilo simple para resolver algo como esto. –

+0

Sí, por supuesto, fue Andrew: [is-there-some-word-wrap-property-of-jlabel-exist] (http://stackoverflow.com/questions/7861724/is-there-some-word- wrap-property-of-jlabel-exist/7861833 # 7861833). Creo que este concepto también se puede usar en tu procesador de células personalizado. –

Respuesta

19

Sí, utilizando el código de Andrew, me ocurrió algo similar:

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

public class JListLimitWidth { 
    public static void main(String[] args) { 
     String[] names = { "John Smith", "engelbert humperdinck", 
      "john jacob jingleheimer schmidt" }; 
     MyCellRenderer cellRenderer = new MyCellRenderer(80); 
     JList list = new JList(names); 
     list.setCellRenderer(cellRenderer); 
     JScrollPane sPane = new JScrollPane(list); 
     JPanel panel = new JPanel(); 
     panel.add(sPane); 
     JOptionPane.showMessageDialog(null, panel); 

    } 
} 

class MyCellRenderer extends DefaultListCellRenderer { 
    public static final String HTML_1 = "<html><body style='width: "; 
    public static final String HTML_2 = "px'>"; 
    public static final String HTML_3 = "</html>"; 
    private int width; 

    public MyCellRenderer(int width) { 
     this.width = width; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
     String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString() 
      + HTML_3; 
     return super.getListCellRendererComponent(list, text, index, isSelected, 
      cellHasFocus); 
    } 

} 
+1

+1 hmmmm qué fácil – mKorbel

+2

No fue mi inteligencia la que hizo esto, sino esta aquí: [la publicación de Andrew] (http://stackoverflow.com/questions/7861724/is-there-some-word-wrap-property- of-jlabel-exist/7861833 # 7861833). No puedo renunciar a su respuesta más de una vez, pero animo a cualquiera que piense que mi respuesta fue útil para anunciar el enlace. –

+0

¡Genial! ¡Sugiero que votemos los dos! –

-1

También puede calcular dinámicamente el ancho (en lugar de un valor fijo):

String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3; 

Así que si el el panel cambia el tamaño de la lista, el ajuste sigue siendo correcto.

actualización

Y el resultado es idéntico: enter image description here

+0

Esto no funciona. Si se cambia el tamaño de la JList, no se ajustará la altura de la fila y se producirán cosas divertidas y visuales. Ver mi imagen adjunta ... Agregué verde y rojo para ayudar a ilustrar. – Jason

0

Se puede hacer aún más fácil. Puede crear JList por consatructor con ListModel. En CustomListModel se extiende el método AbstractListModel, getElementAt() puede devolver Cadena con el mismo texto con formato html. Así que de esta manera hacemos lo mismo sin modificación del procesador celular.

+2

El embalaje es UI y no está relacionado con el modelo. Cambiar el modelo para acomodar la UI es malo. – SurfMan

Cuestiones relacionadas