Ver Mensaje Individual
  #5 (permalink)  
Antiguo 26/04/2019, 22:12
Avatar de detective_jd
detective_jd
 
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
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