Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Personalizando JList

Estas en el tema de Personalizando JList en el foro de Java en Foros del Web. Hola a todos, acá estoy en una situación algo asfixiante, estoy preparando gente para un examen y una mini tesis en java, y dicha institución ...
  #1 (permalink)  
Antiguo 24/04/2019, 21:07
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Personalizando JList

Hola a todos, acá estoy en una situación algo asfixiante, estoy preparando gente para un examen
y una mini tesis en java, y dicha institución prohibe el uso de jtable promoviendo así el uso de jlist, no estoy teniendo problemas en cargar los datos pero sí en personalizarlos.
Logré ponerle cabeceras a los jlist pero sí una columna tiene 2 o más líneas no se adapta la parte de abajo de la comuna, y si el texto es largo no se adapta la parte de la derecha, además de que las cabeceras no deben tener el mismo tamaño de las columnas del jlist.
Intenté usar reflection pero no doy bien al clavo.
Pongo el código para que me digan dónde están los errores y que cambiar:

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.vista.util.columnas.HeaderPanel;
  3. import java.awt.Color;
  4. import java.awt.ComponentOrientation;
  5. import java.awt.FlowLayout;
  6. import java.awt.Font;
  7. import javax.swing.BorderFactory;
  8. import javax.swing.JComponent;
  9. import javax.swing.JLabel;
  10. import javax.swing.JPanel;
  11. import javax.swing.JTextArea;
  12. import javax.swing.ListCellRenderer;
  13. public abstract class CeldaPerformer extends JPanel implements ListCellRenderer {
  14.     protected HeaderPanel header;
  15.     public CeldaPerformer(HeaderPanel xheader) {
  16.         this.header = xheader;
  17.         setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
  18.         setBackground(Color.WHITE);
  19.         setOpaque(true);
  20.         setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  21.     }
  22.     protected void customeColumnRenderer(JComponent xcolumn,JLabel xheader) {
  23.         if(xcolumn instanceof JTextArea){
  24.             JTextArea ta = (JTextArea)xcolumn;
  25.             ta.setOpaque(true);
  26.             ta.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  27.             ta.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
  28.             ta.setForeground(Color.GRAY);
  29.             ta.setPreferredSize(xheader.getPreferredSize());
  30.             ta.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20));
  31.         }
  32.     }
  33.     protected abstract void colourColumn(JComponent xcolumn,Color xc);
  34. }

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.contr.clases.*;
  3. import app.contr.util.Conversiones;
  4. import app.contr.util.FacadeSystem;
  5. import app.vista.util.columnas.*;
  6. import java.awt.*;
  7. import java.lang.reflect.Field;
  8. import javax.swing.*;
  9. public class CeldaRegistro extends CeldaPerformer {
  10.     private JTextArea lregistro = new JTextArea();
  11.     private JTextArea lfecha = new JTextArea();
  12.     private JTextArea lpaciente = new JTextArea();
  13.     private JTextArea lmedico = new JTextArea();
  14.     private JTextArea ldescripcion = new JTextArea();
  15.     private JTextArea ltratamiento = new JTextArea();
  16.     public CeldaRegistro(HeaderPanel xheader) {
  17.         super(xheader);
  18.         try {
  19.             rendererColumn((HeaderRegistro)header);
  20.             customeColumnRenderer(lregistro, ((HeaderRegistro)header).getLregistro());
  21.             customeColumnRenderer(lfecha, ((HeaderRegistro)header).getLfecha());
  22.             customeColumnRenderer(lpaciente, ((HeaderRegistro)header).getLpaciente());
  23.             customeColumnRenderer(lmedico, ((HeaderRegistro)header).getLmedico());
  24.             customeColumnRenderer(ldescripcion, ((HeaderRegistro)header).getLdescripcion());
  25.             customeColumnRenderer(ltratamiento, ((HeaderRegistro)header).getLtratamiento());
  26.             this.add(lregistro);
  27.             this.add(lfecha);
  28.             this.add(lpaciente);
  29.             this.add(lmedico);
  30.             this.add(ldescripcion);
  31.             this.add(ltratamiento);
  32.         } catch(Exception ex){
  33.             System.out.println(ex.getMessage());
  34.         }        
  35.     }
  36.     private void rendererColumn(HeaderRegistro xheader) throws Exception {
  37.         for(Field f : xheader.getClass().getDeclaredFields()){
  38.             f.setAccessible(true);
  39.             Object obj = f.get(xheader);
  40.             if(obj instanceof JLabel){
  41.                 JLabel l = (JLabel)obj;
  42.                 l.setBorder(BorderFactory.createEmptyBorder(0, 20, 50, 150));
  43.             }
  44.         }
  45.     }
  46.     private int getBottom() throws Exception {
  47.         int maxbottom = 0;
  48.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  49.             for(Registro r : p.getRegistros().getChildrens()){
  50.                 for(Field f : r.getClass().getDeclaredFields()){
  51.                     f.setAccessible(true);
  52.                     Object obj = f.get(r);
  53.                     if(obj instanceof String){
  54.                         String str  = (String)obj;
  55.                         String[] aux = str.split("\n");
  56.                         if(aux.length > 1){
  57.                             for(String s : aux){
  58.                                 maxbottom += 20;                            
  59.                             }
  60.                         }
  61.                     }
  62.                 }
  63.             }
  64.         }
  65.         return maxbottom;
  66.     }
  67.     private int getRight() throws Exception {
  68.         int maxright = Integer.MIN_VALUE;
  69.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  70.             for(Registro r : p.getRegistros().getChildrens()){
  71.                 for(Field f : r.getClass().getDeclaredFields()){
  72.                     f.setAccessible(true);
  73.                     Object obj = f.get(r);
  74.                     if(obj instanceof String){
  75.                         String str  = (String)obj;
  76.                         String[] aux = str.split("\n");
  77.                         if(aux.length > 1){
  78.                             for(String s : aux){
  79.                                 if(s.length() > maxright){
  80.                                     maxright = s.length();
  81.                                 }
  82.                             }
  83.                         }
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.         return maxright * 70;
  89.     }
  90.     @Override
  91.     protected void colourColumn(JComponent xcolumn,Color xc){
  92.         if(xcolumn instanceof JTextArea){
  93.             JTextArea ta = (JTextArea)xcolumn;
  94.             ta.setBackground(xc);
  95.             ta.setForeground(Color.BLACK);
  96.             ta.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20));
  97.         }
  98.     }
  99.     @Override
  100.     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
  101.         Registro data = (Registro)value;
  102.         lregistro.setText(Conversiones.CStr(data.getId()));
  103.         lfecha.setText(Conversiones.MostrarFechaYHora(data.getConsulta().getFecha()));
  104.         lmedico.setText(data.getConsulta().getMedico().getNombre() + " " + data.getConsulta().getMedico().getApellido());
  105.         lpaciente.setText(data.getConsulta().getPaciente().getNombre() + " " + data.getConsulta().getPaciente().getApellido());
  106.         ldescripcion.setText(data.getDescripcion());
  107.         ltratamiento.setText(data.getTratamientos());
  108.         if (index % 2 == 0) {
  109.             colourColumn(lregistro, Color.LIGHT_GRAY);
  110.             colourColumn(lfecha, Color.LIGHT_GRAY);
  111.             colourColumn(lmedico, Color.LIGHT_GRAY);
  112.             colourColumn(lpaciente, Color.LIGHT_GRAY);
  113.             colourColumn(ldescripcion, Color.LIGHT_GRAY);
  114.             colourColumn(ltratamiento, Color.LIGHT_GRAY);            
  115.         } else {
  116.             colourColumn(lregistro, Color.WHITE);
  117.             colourColumn(lfecha, Color.WHITE);
  118.             colourColumn(lmedico, Color.WHITE);
  119.             colourColumn(lpaciente, Color.WHITE);
  120.             colourColumn(ldescripcion, Color.WHITE);
  121.             colourColumn(ltratamiento, Color.WHITE);
  122.         }
  123.         if(isSelected) {
  124.             colourColumn(lregistro, Color.PINK);
  125.             colourColumn(lfecha, Color.PINK);
  126.             colourColumn(lmedico, Color.PINK);
  127.             colourColumn(lpaciente, Color.PINK);
  128.             colourColumn(ldescripcion, Color.PINK);
  129.             colourColumn(ltratamiento, Color.PINK);
  130.         }
  131.         setEnabled(list.isEnabled());
  132.         setFont(list.getFont());
  133.         return this;
  134.     }
  135. }
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 24/04/2019, 21:08
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Continuo poniendo el código:

Código Java:
Ver original
  1. package app.vista.util.columnas;
  2. import java.awt.FlowLayout;
  3. import javax.swing.BorderFactory;
  4. import javax.swing.JLabel;
  5. import javax.swing.JPanel;
  6. public class HeaderPanel extends JPanel {
  7.     public HeaderPanel() {            
  8.         setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
  9.     }
  10.     protected void customeHeader(JLabel xheader,int lr){
  11.         xheader.setHorizontalTextPosition(JLabel.LEFT);
  12.         xheader.setVerticalTextPosition(JLabel.BOTTOM);
  13.         xheader.setBorder(BorderFactory.createEmptyBorder(5, lr, 5, lr));
  14.     }
  15. }

Código Java:
Ver original
  1. package app.vista.util.columnas;
  2. import javax.swing.JLabel;
  3. public class HeaderRegistro extends HeaderPanel {
  4.     private JLabel lregistro = new JLabel("Registro");
  5.     private JLabel lfecha = new JLabel("Fecha");
  6.     private JLabel lpaciente = new JLabel("Paciente");
  7.     private JLabel lmedico = new JLabel("Médico");
  8.     private JLabel ldescripcion = new JLabel("Descripción");
  9.     private JLabel ltratamiento = new JLabel("Tratamiento");
  10.     public HeaderRegistro() {
  11.         super();
  12.         this.customeHeader(lregistro, 30);
  13.         this.customeHeader(lfecha, 60);
  14.         this.customeHeader(lpaciente,70);
  15.         this.customeHeader(lmedico,70);
  16.         this.customeHeader(ldescripcion,120);
  17.         this.customeHeader(ltratamiento,120);        
  18.         this.add(lregistro);
  19.         this.add(lfecha);
  20.         this.add(lpaciente);
  21.         this.add(lmedico);
  22.         this.add(ldescripcion);
  23.         this.add(ltratamiento);
  24.     }
  25.     public JLabel getLregistro() {
  26.         return lregistro;
  27.     }
  28.     public JLabel getLfecha() {
  29.         return lfecha;
  30.     }
  31.     public JLabel getLpaciente() {
  32.         return lpaciente;
  33.     }
  34.     public JLabel getLmedico() {
  35.         return lmedico;
  36.     }
  37.     public JLabel getLdescripcion() {
  38.         return ldescripcion;
  39.     }
  40.     public JLabel getLtratamiento() {
  41.         return ltratamiento;
  42.     }    
  43. }

Para cargar en el formulario:

Código Java:
Ver original
  1. private void cargarHistoriaClinica(Paciente paciente){
  2.         pnlshowhistoriaclinica.removeAll();
  3.         pnlshowhistoriaclinica.setLayout(new BorderLayout());
  4.         HeaderRegistro hreg = new HeaderRegistro();                
  5.         lthistoriaclinica.setModel(new ModeloRegistro(paciente));
  6.         lthistoriaclinica.setCellRenderer(new CeldaRegistro(hreg));
  7.         sphistoriaclinica = new JScrollPane(lthistoriaclinica);
  8.         pnlshowhistoriaclinica.add(hreg, BorderLayout.PAGE_START);
  9.         pnlshowhistoriaclinica.add(sphistoriaclinica);
  10.         pnlshowhistoriaclinica.updateUI();
  11.     }

Pongo un link que tiene una imagen para que ven mejor el problema:

Tratando de personalizar los JList

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #3 (permalink)  
Antiguo 25/04/2019, 09:38
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Personalizando JList

No tengo idea de como resolver lo especifico que preguntas, pero como el codigo esta aqui para ser sometido al escrutinio, te sugiero que mejores el codigo reduciendo la redundancia del mismo. Mas facil comprender el codigo si hay menos que leer.

- Elimina los "this." innecesarios
- Elimina los casts especificando el tipo correcto en los parametros, en vez de pasar un tipo generico y luego hacer casts por cada vez que aparece el parametro.
- En vez de tener varias veces las mismas instrucciones con distintos valores (por ejemplo cuando se establece el color en getListCellRendererComponent, haz la logica para decidir respecto al color solamente y luego cambia el color 1 vez con el color que se eligio en la logica.
- Parece mas facil de leer si el codigo esta todo en espan~ol o todo en ingles, la mezcla no parece bien. Ejemplo

Registro r : p.getRegistros().getChildrens().

A proposito de ingles, si es que decides dejarlo asi, children ya es plural, no requiere la s.
- getBottom() y getRight() parecen copia una de la otra, son super parecidas, y ademas, no se usan en ninguna parte. Por que no eliminarlas? O bien sacar factor comun y eliminar la redundancia?
- En estas lineas
lmedico.setText(data.getConsulta().getMedico().get Nombre() + " " + data.getConsulta().getMedico().getApellido());
lpaciente.setText(data.getConsulta().getPaciente() .getNombre() + " " + data.getConsulta().getPaciente().getApellido());

puedes definir una variable para data.getConsulta() y luego usarla 4 veces.

Última edición por CalgaryCorpus; 25/04/2019 a las 09:49
  #4 (permalink)  
Antiguo 26/04/2019, 05:32
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Personalizando JList

Mira si sacas algo útil de alguno de estos enlaces

https://www.codejava.net/java-se/swi...nderer-example
http://www.java2s.com/Tutorials/Java...llRenderer.htm
https://cachhoc.net/2014/04/25/java-...derer/?lang=en
https://stackoverflow.com/questions/...e-jlists-items
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 26/04/2019, 22:12
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Hola, gracias por responderme CalgaryCorpus y FuzzyLog, en base a lo que me dijeron hice los siguientes cambios:

Código Java:
Ver original
  1. package app.vista.util.columnas;
  2. import java.awt.FlowLayout;
  3. import javax.swing.BorderFactory;
  4. import javax.swing.JLabel;
  5. import javax.swing.JPanel;
  6. public abstract class HeaderPanel extends JPanel {
  7.     protected JLabel[] headers;
  8.     public HeaderPanel() {            
  9.         setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
  10.         prepareHeaders();
  11.     }
  12.     protected void customeHeader(int i,int lr){
  13.         JLabel temp = headers[i];
  14.         temp.setHorizontalTextPosition(JLabel.LEFT);
  15.         temp.setVerticalTextPosition(JLabel.BOTTOM);
  16.         temp.setBorder(BorderFactory.createEmptyBorder(5, lr, 5, lr));
  17.         headers[i] = temp;
  18.     }
  19.     protected void addHeaders(){
  20.         for(JLabel l : headers){
  21.             add(l);
  22.         }
  23.     }
  24.     public JLabel[] getHeaders(){
  25.         return headers;
  26.     }
  27.     abstract protected void prepareHeaders();
  28. }

Código Java:
Ver original
  1. package app.vista.util.columnas;
  2. import javax.swing.JLabel;
  3. public class HeaderRegistro extends HeaderPanel {
  4.     public HeaderRegistro() {
  5.         super();
  6.         customeHeader(0, 30);
  7.         customeHeader(1, 60);
  8.         customeHeader(2,70);
  9.         customeHeader(3,70);
  10.         customeHeader(4,120);
  11.         customeHeader(5,120);        
  12.         addHeaders();
  13.     }
  14.     @Override
  15.     protected void prepareHeaders() {
  16.         headers = new JLabel[]{
  17.             new JLabel("Registro"),
  18.             new JLabel("Fecha"),
  19.             new JLabel("Paciente"),
  20.             new JLabel("Médico"),
  21.             new JLabel("Descripción"),
  22.             new JLabel("Tratamiento")    
  23.         };
  24.     }
  25. }

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.vista.util.columnas.HeaderPanel;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. public abstract class CeldaPerformer extends JPanel implements ListCellRenderer {
  6.     protected HeaderPanel header;
  7.     protected JTextArea[] columns;
  8.     public CeldaPerformer(HeaderPanel xheader) {
  9.         this.header = xheader;
  10.         setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
  11.         setBackground(Color.WHITE);
  12.         setOpaque(true);
  13.         setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  14.         prepareColumns();
  15.     }
  16.     protected void customeColumnRenderer(JTextArea ta,JLabel xheader) {
  17.         ta.setOpaque(true);
  18.         ta.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  19.         ta.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
  20.         ta.setForeground(Color.BLACK);
  21.         ta.setPreferredSize(xheader.getPreferredSize());
  22.         ta.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20));        
  23.     }
  24.     protected void colourColumn(JTextArea ta,Color xc){
  25.         ta.setBackground(xc);        
  26.         ta.setForeground(Color.BLACK);
  27.     }    
  28.     protected void prepareColumns(){
  29.         columns = new JTextArea[header.getHeaders().length];
  30.         for(int i = 0; i < header.getHeaders().length; i++){
  31.             columns[i] = new JTextArea();
  32.             customeColumnRenderer(columns[i], header.getHeaders()[i]);
  33.         }
  34.         for(JTextArea ta : columns){
  35.             add(ta);
  36.         }
  37.     }
  38.     @Override
  39.     public Component getListCellRendererComponent(JList list, Object value,
  40.         int index, boolean isSelected, boolean cellHasFocus) {
  41.         displayColumns(value);
  42.         if (index % 2 == 0) {
  43.             for (JTextArea column : columns) {
  44.                 colourColumn(column, Color.LIGHT_GRAY);
  45.             }
  46.         } else {
  47.             for (JTextArea column : columns) {
  48.                 colourColumn(column, Color.WHITE);
  49.             }
  50.         }        
  51.         if(isSelected){
  52.             for (JTextArea column : columns) {
  53.                 colourColumn(column, Color.PINK);
  54.             }
  55.         }
  56.         setEnabled(list.isEnabled());
  57.         setFont(list.getFont());
  58.         return this;
  59.     }
  60.     public abstract void displayColumns(Object value);
  61. }

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.contr.clases.*;
  3. import app.contr.util.Conversiones;
  4. import app.contr.util.FacadeSystem;
  5. import app.vista.util.columnas.*;
  6. import java.awt.*;
  7. import javax.swing.*;
  8. public class CeldaRegistro extends CeldaPerformer {
  9.     public CeldaRegistro(HeaderPanel xheader) {
  10.         super(xheader);
  11.     }
  12.     @Override
  13.     protected void prepareColumns() {
  14.         columns = new JTextArea[header.getHeaders().length];
  15.         for(int i = 0; i < header.getHeaders().length; i++){
  16.             columns[i] = new JTextArea();
  17.         }
  18.         for(int i = 0; i < columns.length; i++){            
  19.             int bottom = getBottom();
  20.             if(bottom == 0){
  21.                 bottom = header.getHeaders()[i].getPreferredSize().height;
  22.             }
  23.             columns[i].setOpaque(true);
  24.             columns[i].setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  25.             columns[i].setForeground(Color.BLACK);
  26.             columns[i].setComponentOrientation(
  27.                 ComponentOrientation.LEFT_TO_RIGHT);
  28.             columns[i].setPreferredSize(new Dimension(
  29.                 header.getHeaders()[i].getPreferredSize().width, bottom));
  30.             columns[i].setBorder(BorderFactory.createEmptyBorder(
  31.                 0, 20, bottom, 20));
  32.                        
  33.             add(columns[i]);
  34.         }
  35.     }
  36.     private int getBottom(){
  37.         int maxlength = 1;
  38.         int maxBottom = 0;
  39.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  40.             for(Registro r : p.getRegistros().getChildren()){
  41.                 String[] descrip = r.getDescripcion().split("\n");
  42.                 if(descrip.length > maxlength){
  43.                     maxlength = descrip.length;
  44.                 }
  45.                 String[] tratat = r.getTratamientos().split("\n");
  46.                 if(tratat.length > maxlength){
  47.                     maxlength = tratat.length;
  48.                 }
  49.             }
  50.         }
  51.         if(maxlength > 1){
  52.             for(int i = 0; i < maxlength; i++){
  53.                 maxBottom += 25;
  54.             }
  55.         }
  56.         return maxBottom;
  57.     }
  58.     @Override
  59.     public void displayColumns(Object value) {
  60.         Registro data = (Registro)value;
  61.         Consulta c = data.getConsulta();
  62.         columns[0].setText(Conversiones.CStr(data.getId()));
  63.         columns[1].setText(Conversiones.MostrarFechaYHora(c.getFecha()));
  64.         columns[2].setText(c.getMedico().getNombre() + " " + c.getMedico().getApellido());
  65.         columns[3].setText(c.getPaciente().getNombre() + " " + c.getPaciente().getApellido());
  66.         columns[4].setText(data.getDescripcion());
  67.         columns[5].setText(data.getTratamientos());
  68.     }
  69. }

Por cierto también uso otras Celdas y Headers, pero esos no importan en este momento, resulta que logré implementar bien que se adapten la parte de abajo según los saltos de líneas que puede tener la descripción y/o tratamiento de un registro, pero por alguna razón no me muestra el color de letra, y eso que está implementado.

Pongo el link para que lo ven mejor.
Mejorando personalización de JList - parte de abajo adaptada.

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #6 (permalink)  
Antiguo 27/04/2019, 07:33
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Personalizando JList

De curiosidad, porque no se ve, que objeto es de tipo JList en tu codigo?
No se ve ningun codigo que lo instancie o que use el customRenderer.
Agregalo.

Si no tienes ningun objeto de tipo JList en tu codigo, o bien no le estas aplicando el renderer, entonces ya tienes la respuesta de porque esto no funciona.

A proposito, creo que quisiste decir custom, no custome.
__________________
Visita mi perfil en LinkedIn
  #7 (permalink)  
Antiguo 27/04/2019, 21:59
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Hola, gracias CalgaryCorpus, verás al resto de los jlist que tienen headers y celdas todos funcionan bien además de estar implementados de la misma manera que este, de hecho simplifique más la superclase:

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.vista.util.columnas.HeaderPanel;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. public abstract class CeldaPerformer extends JPanel implements ListCellRenderer {
  6.     protected HeaderPanel header;
  7.     protected JTextArea[] columns;
  8.     public CeldaPerformer(HeaderPanel xheader) {
  9.         this.header = xheader;
  10.         setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));
  11.         setBackground(Color.WHITE);
  12.         setOpaque(true);
  13.         setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  14.         prepareColumns();
  15.     }
  16.     protected void customRenderer(JTextArea ta,JLabel xheader) {
  17.         ta.setOpaque(true);
  18.         ta.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  19.         ta.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
  20.         ta.setForeground(Color.BLACK);
  21.         ta.setPreferredSize(xheader.getPreferredSize());
  22.         ta.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20));        
  23.     }
  24.     protected void colourColumn(JTextArea ta,Color xc){
  25.         ta.setBackground(xc);        
  26.         ta.setForeground(Color.BLACK);
  27.     }    
  28.     protected void prepareColumns(){
  29.         columns = new JTextArea[header.getHeaders().length];
  30.         for(int i = 0; i < header.getHeaders().length; i++){
  31.             columns[i] = new JTextArea();
  32.             customRenderer(columns[i], header.getHeaders()[i]);
  33.             add(columns[i]);
  34.         }
  35.     }
  36.     @Override
  37.     public Component getListCellRendererComponent(JList list, Object value,
  38.         int index, boolean isSelected, boolean cellHasFocus) {
  39.         displayColumns(value);
  40.         if (index % 2 == 0) {
  41.             for (JTextArea column : columns) {
  42.                 colourColumn(column, Color.LIGHT_GRAY);
  43.             }
  44.         } else {
  45.             for (JTextArea column : columns) {
  46.                 colourColumn(column, Color.WHITE);
  47.             }
  48.         }        
  49.         if(isSelected){
  50.             for (JTextArea column : columns) {
  51.                 colourColumn(column, Color.PINK);
  52.             }
  53.         }
  54.         return this;
  55.     }
  56.     public abstract void displayColumns(Object value);
  57. }

y la subclase:

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.contr.clases.*;
  3. import app.contr.util.Conversiones;
  4. import app.contr.util.FacadeSystem;
  5. import app.vista.util.columnas.*;
  6. import java.awt.*;
  7. import javax.swing.*;
  8. public class CeldaRegistro extends CeldaPerformer {
  9.     public CeldaRegistro(HeaderPanel xheader) {
  10.         super(xheader);
  11.     }
  12.     @Override
  13.     protected void customRenderer(JTextArea ta,JLabel xheader) {        
  14.         ta.setOpaque(true);
  15.         ta.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  16.         ta.setComponentOrientation(
  17.             ComponentOrientation.LEFT_TO_RIGHT);
  18.         ta.setForeground(Color.BLACK);            
  19.         int bottom = getBottom();
  20.         if(bottom == 0){
  21.             bottom = xheader.getPreferredSize().height;
  22.         }
  23.         ta.setPreferredSize(new Dimension(
  24.             xheader.getPreferredSize().width, bottom));
  25.         ta.setBorder(BorderFactory.createEmptyBorder(
  26.             0, 20, bottom, 20));
  27.     }
  28.     private int getBottom(){
  29.         int maxlength = 1;
  30.         int maxBottom = 0;
  31.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  32.             for(Registro r : p.getRegistros().getChildren()){
  33.                 String[] descrip = r.getDescripcion().split("\n");
  34.                 if(descrip.length > maxlength){
  35.                     maxlength = descrip.length;
  36.                 }
  37.                 String[] tratat = r.getTratamientos().split("\n");
  38.                 if(tratat.length > maxlength){
  39.                     maxlength = tratat.length;
  40.                 }
  41.             }
  42.         }
  43.         if(maxlength > 1){
  44.             for(int i = 0; i < maxlength; i++){
  45.                 maxBottom += 25;
  46.             }
  47.         } else {
  48.             maxBottom = 25;
  49.         }
  50.         return maxBottom;
  51.     }
  52.     @Override
  53.     public void displayColumns(Object value) {
  54.         Registro data = (Registro)value;
  55.         Consulta c = data.getConsulta();
  56.         columns[0].setText(Conversiones.CStr(data.getId()));
  57.         columns[1].setText(Conversiones.MostrarFechaYHora(c.getFecha()));
  58.         columns[2].setText(c.getMedico().getNombre() + " " + c.getMedico().getApellido());
  59.         columns[3].setText(c.getPaciente().getNombre() + " " + c.getPaciente().getApellido());
  60.         columns[4].setText(data.getDescripcion());
  61.         columns[5].setText(data.getTratamientos());
  62.     }
  63. }

Cita:
Si no tienes ningun objeto de tipo JList en tu codigo, o bien no le estas aplicando el renderer, entonces ya tienes la respuesta de porque esto no funciona.
El único es el parámetro de la función getListCellRendererComponent, probé con el setFont pero no hace nada.
Raro porque todos los demás funcionan menos este.

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #8 (permalink)  
Antiguo 28/04/2019, 04:28
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Personalizando JList

Lo que veo es que no tienes ningun JList.
No se a que le llamas JList si no tienes ninguno creado.

Mira los links que te enviaron y busca "JList" y vas a ver que aparece no solo en el parametro de una funcion, sino que ademas es un objeto que esta siendo creado explicitamente. Tu no tienes ningun JList en el codigo que has presentado. Falta algun codigo por mostrar que lo incluye?

El que aceptes un JList en alguna funcion no hace que tu tengas un JList, solo que estas implementando ese metodo y nunca nadie lo usa. Por eso no te funciona. Eso creo que es lo que te esta pasando.

Podrias decir a que le llamas "JList" ? Existe alguna clase que deriva de JList aqui?
Soy ignorante en esto, pero como observador externo me da la idea que estas siguiendo casi todo el protocolo para que funcione, excepto que no tienes ninguna clase JList aqui y no importa cuanto cambies la implementacion, no te va a funcionar a menos que crees y apliques tu funcion a un objeto del tipo adecuado.
__________________
Visita mi perfil en LinkedIn
  #9 (permalink)  
Antiguo 28/04/2019, 19:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Hola, CalgaryCorpus gracias por responder, resolví el problema, resulta que estaba mal el setBorder, sólo por poner en la parte bottom el ancho de la columna si fuera 50 nunca me iba a mostrar el texto, el código me quedó asi:

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.contr.clases.*;
  3. import app.contr.util.Conversiones;
  4. import app.contr.util.FacadeSystem;
  5. import app.vista.util.columnas.*;
  6. import java.awt.*;
  7. import javax.swing.*;
  8. public class CeldaRegistro extends CeldaPerformer {
  9.     public CeldaRegistro(HeaderPanel xheader) {
  10.         super(xheader);
  11.     }
  12.     @Override
  13.     protected void customRenderer(JTextArea ta,JLabel xheader) {        
  14.         ta.setOpaque(true);
  15.         ta.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  16.         ta.setComponentOrientation(
  17.             ComponentOrientation.LEFT_TO_RIGHT);
  18.         ta.setForeground(Color.BLACK);          
  19.         ta.setPreferredSize(new Dimension(
  20.             xheader.getPreferredSize().width, getBottom(xheader)));
  21.         [B][COLOR="Red"]ta.setBorder(BorderFactory.createEmptyBorder(
  22.             0, 20, 0, 20));[/COLOR][/B]
  23.     }
  24.     private int getBottom(JLabel xheader){
  25.         int bottom = getBottom();
  26.         if(bottom == 0){
  27.             bottom = xheader.getPreferredSize().height;
  28.         }
  29.         return bottom;
  30.     }
  31.     private int getBottom(){
  32.         int maxlength = 1;
  33.         int maxBottom = 0;
  34.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  35.             for(Registro r : p.getRegistros().getChildren()){
  36.                 String[] descrip = r.getDescripcion().split("\n");
  37.                 if(descrip.length > maxlength){
  38.                     maxlength = descrip.length;
  39.                 }
  40.                 String[] tratat = r.getTratamientos().split("\n");
  41.                 if(tratat.length > maxlength){
  42.                     maxlength = tratat.length;
  43.                 }
  44.             }
  45.         }
  46.         if(maxlength > 1){
  47.             for(int i = 0; i < maxlength; i++){
  48.                 maxBottom += 25;
  49.             }
  50.         } else {
  51.             maxBottom = 25;
  52.         }
  53.         return maxBottom;
  54.     }
  55.     @Override
  56.     public void displayColumns(Object value) {
  57.         Registro data = (Registro)value;
  58.         Consulta c = data.getConsulta();
  59.         columns[0].setText(Conversiones.CStr(data.getId()));
  60.         columns[1].setText(Conversiones.MostrarFechaYHora(c.getFecha()));
  61.         columns[2].setText(c.getMedico().getNombre() + " " + c.getMedico().getApellido());
  62.         columns[3].setText(c.getPaciente().getNombre() + " " + c.getPaciente().getApellido());
  63.         columns[4].setText(data.getDescripcion());
  64.         columns[5].setText(data.getTratamientos());
  65.     }
  66. }

Ahora lo que tengo que adaptar es la parte del largo para que no me quede cómo la imagen, pongo el link:
Personalizando JList, ancho adaptado, largo por implementar.

Con respecto a:

Cita:
Soy ignorante en esto
En realidad no creo que lo seas, de hecho un ignorante no ayudaría a muchos como tu lo haces.

Espero sus respuestas y Saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #10 (permalink)  
Antiguo 29/04/2019, 06:49
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Personalizando JList

Sigo siendo un observador, pues desconozco lo particular.

No respondiste lo que pregunte.
A que le llamas JList si no tienes o no pareces tener ningun objeto de ese tipo?

Creo que tu codigo funcionaria igual de bien o mal si eliminas el "implements ListCellRenderer" y remueves la funcion getListCellRendererComponent, pues no tiene sentido haberla implementado si no la usas nunca.

Solo tiene sentido si hubiera algun JList y si se lo aplicaras a algun JList, pero no es el caso, a menos que tengas mas codigo que el que muestras.

Pregunto otra vez: Tienes algun codigo que no has mostrado en que se instancie un JList y se le aplique lo que CeldaPerformer ha implementado?
A que le llamas JList si no es asi? Existe alguna clase que derive de JList aqui?

Si no es asi, lo unico que tienes de JList es un parametro de una funcion que no usas, y si es asi, eliminala, remueve el "implements ListCellRenderer" que te fuerza a incluirla, y ya no digas que estas personalizando un JList, porque no parece ser el caso.
__________________
Visita mi perfil en LinkedIn
  #11 (permalink)  
Antiguo 29/04/2019, 22:06
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Hola Calgary Corpus, verás en CeldaRegistro no lo tiene, pero puedo ponerle estás líneas de relleno (las comenté y no cambia en nada estando o no):

Código Java:
Ver original
  1. setEnabled(list.isEnabled());
  2. setFont(list.getFont());

Cita:
Creo que tu codigo funcionaria igual de bien o mal si eliminas el "implements ListCellRenderer" y remueves la funcion getListCellRendererComponent, pues no tiene sentido haberla implementado si no la usas nunca.
El problema está en este código, que está en el código:

Código Java:
Ver original
  1. private void cargarHistoriaClinica(Paciente paciente){
  2.         pnlshowhistoriaclinica.removeAll();
  3.         pnlshowhistoriaclinica.setLayout(new BorderLayout());
  4.         HeaderRegistro hreg = new HeaderRegistro();                
  5.         lthistoriaclinica.setModel(new ModeloRegistro(paciente));
  6.         [B]lthistoriaclinica.setCellRenderer(new CeldaRegistro(hreg));[/B]
  7.         sphistoriaclinica = new JScrollPane(lthistoriaclinica);
  8.         pnlshowhistoriaclinica.add(hreg, BorderLayout.PAGE_START);
  9.         pnlshowhistoriaclinica.add(sphistoriaclinica);
  10.         pnlshowhistoriaclinica.updateUI();
  11.     }

Sucede que para usar el setCellRenderer en los jlist pero el parámetro debe ser si o si de tipo ListCellRenderer, además puse el listado que no funciona porque el código tiene varios jlist con modelos, cabeceras y celdas que funcionan.

Pero tengo problemas para adaptar el largo, mi problema está en el cálculo pongo el código:

Código Java:
Ver original
  1. protected void customRendererRight(JTextArea ta,int i,int right) {
  2.         ta.setOpaque(true);
  3.         ta.setFont(new Font("DejaVu Sans",Font.BOLD, 12));
  4.         ta.setComponentOrientation(
  5.             ComponentOrientation.LEFT_TO_RIGHT);
  6.         ta.setForeground(Color.BLACK);
  7.         header.getHeaders()[i].setPreferredSize(new Dimension(getRight(i,right),
  8.             header.getHeaders()[i].getPreferredSize().height));
  9.         ta.setPreferredSize(new Dimension(getRight(i,right),
  10.             getBottom(header.getHeaders()[i])));
  11.         ta.setBorder(BorderFactory.createEmptyBorder(
  12.             0, 20, 0, 20));
  13.     }
  14.     private int getRight(int i, int typeRight){
  15.         System.out.println("del string: "+ (typeRight + 40));
  16.         System.out.println("de la cabecera: "+ (header.getHeaders()[i].getPreferredSize().width));
  17.         int right = typeRight;
  18.         int nowRight = header.getHeaders()[i].getPreferredSize().width - 40;
  19.         if((right + 40) > nowRight){
  20.             int dif = right - nowRight;
  21.             right = header.getHeaders()[i].getPreferredSize().width + dif + 20;
  22.         } else {
  23.             right = header.getHeaders()[i].getPreferredSize().width;
  24.         }
  25.         return right;
  26.     }
  27.     private int getRightTratat(){
  28.         int length = 0;
  29.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  30.             for(Registro r : p.getRegistros().getChildren()){
  31.                 String[] tratat = r.getTratamientos().split("\n");
  32.                 for(String s : tratat){
  33.                     if(s.length() > length){
  34.                         length = s.length();
  35.                     }
  36.                 }
  37.             }
  38.         }
  39.         return length;
  40.     }
  41.     private int getRightDescrip(){
  42.         int length = 0;
  43.         for(Paciente p : FacadeSystem.getInstance().manejadorDePacientes().findAll(null)){
  44.             for(Registro r : p.getRegistros().getChildren()){
  45.                 String[] descrip = r.getDescripcion().split("\n");
  46.                 for(String s : descrip){
  47.                     if(s.length() > length){
  48.                         length = s.length();
  49.                     }
  50.                 }
  51.             }
  52.         }
  53.         return length;
  54.     }

El getRight(int i, int typeRight) en consola me aparece esto:

Cita:
del string: 74
de la cabecera: 322
del string: 75
de la cabecera: 327
del string es el del texto y la cabecera es el largo de la misma para la columna pero la forma de obtenerlo ya es mala porque 40 es la separación de la parte izquierda y derecha de las columnas. ¿Que se les ocurre?

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #12 (permalink)  
Antiguo 30/04/2019, 22:45
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Me siento axifiado con este código, así que cambié el plan, lo que debería hacer es calcular la diferencia entre el width y height del jtextarea si el largo del string que obtengo cada char de mi jtextarea es igual a la diferencia, se debería generar un salto de línea automáticamente así hasta terminar de recorrer el string.

Intento pero no doy bien con el width y height del jtextarea, pongo el código:

Código Java:
Ver original
  1. private void convertText(JTextArea ta){
  2.         String show = "";        
  3.         int max = ta.getBounds().width - ta.getBounds().height;        
  4.         System.out.println(max);
  5.         for(char c : ta.getText().toCharArray()){
  6.             show += c;
  7.             if(show.length() == max) {
  8.                 show +="\n";
  9.             }
  10.         }
  11.         ta.setText(show);
  12.     }

Una vez obtenido eso debería ser más fácil las adaptaciones que no me salen.

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #13 (permalink)  
Antiguo 03/05/2019, 04:13
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Personalizando JList

Échale un vistazo a este enlace

https://coderanch.com/t/333795/java/...text-JTextArea
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #14 (permalink)  
Antiguo 31/05/2019, 22:06
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Personalizando JList

Buenas a todos, resolví mi problema de una forma no convencional, tuve que crear una función que me genera un string limitando la cantidad de caracteres a mostrar y mostrando puntos suspensivos.

Código Java:
Ver original
  1. package app.vista.util.celdas;
  2. import app.vista.util.headers.HeaderPanel;
  3. import app.contr.clases.*;
  4. import app.contr.util.Conversiones;
  5. public class CeldaRegistro extends CeldaPerformer {
  6.     public CeldaRegistro(HeaderPanel xheader) {
  7.         super(xheader);
  8.     }
  9.     @Override
  10.     public void displayColumns(Object value) {
  11.         Registro data = (Registro)value;
  12.         Consulta c = data.getConsulta();
  13.         columns[0].setText(Conversiones.CStr(data.getId()));
  14.         columns[1].setText(Conversiones.MostrarFechaYHora(c.getFecha()));
  15.         columns[2].setText(c.getMedico().getNombre() + " " + c.getMedico().getApellido());
  16.         columns[3].setText(c.getPaciente().getNombre() + " " + c.getPaciente().getApellido());
  17.         columns[4].setText(generateWord(data.getDescripcion()));
  18.         columns[5].setText(generateWord(data.getTratamientos()));
  19.     }
  20.     private String generateWord(String text){
  21.         String s = "";
  22.         String aux = text.split("\n")[0];
  23.         for(int i = 0; i < aux.length(); i++){
  24.             if(i < 20){
  25.                 s += aux.charAt(i);
  26.             }
  27.         }
  28.         s+= "...";
  29.         return s;
  30.     }
  31. }

Y eso es todo, muchas gracias por la ayuda.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias

Etiquetas: jlist
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:18.