Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/08/2016, 04:26
raquelRkl
 
Fecha de Ingreso: enero-2016
Mensajes: 16
Antigüedad: 8 años, 4 meses
Puntos: 1
Respuesta: Fila fija en JTable sin dos tablas

Encontre una solución un poco chapucera... pero la dejo por si a alguien le interesa:

Código Java:
Ver original
  1. public class tablaFija extends JFrame{
  2.    
  3.     Object[][] data;
  4.     Object[] column;
  5.     JScrollPane scroll, mainScroll, fixedScroll;
  6.     JTable table, fixedTable;  
  7.     DefaultTableModel modelo;
  8.     JPanel pCentral;
  9.    
  10.     public tablaFija(){
  11.         super("Tabla Fija");
  12.        
  13.         setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  
  14.        
  15.         //creamos datos
  16.          data = new Object[][] { { "a", "", "", "", "", "" },
  17.                     { "", "b", "", "", "", "" }, { "", "", "c", "", "", "" },
  18.                     { "", "", "", "d", "", "" }, { "", "", "", "", "e", "" },
  19.                     { "", "", "", "", "", "f" },
  20.                     { "fixed1", "", "", "", "", "", "", "" },
  21.                     { "fixed2", "", "", "", "", "", "", "" } };
  22.          column = new Object[] { "A", "B", "C", "D", "E", "F" };
  23.  
  24.          //creamos el panelCentral con CardLayout
  25.          pCentral = new JPanel();
  26.          getContentPane().add(pCentral, BorderLayout.CENTER);
  27.          CardLayout card = new CardLayout();
  28.          pCentral.setLayout(card);
  29.          
  30.         //creamos el JScrollPane sin elementos fijos
  31.          scroll = new JScrollPane(table);
  32.          scroll.setPreferredSize(new Dimension(400, 100));
  33.          
  34.          
  35.          //creamos el panel con elementos fijos
  36.          JPanel pFijo = new JPanel();
  37.          pFijo.setLayout(new BorderLayout(0, 0));
  38.          
  39.          //añadimos los dos CardLayout
  40.          pCentral.add(scroll, "op1");
  41.          pCentral.add(pFijo, "op2");
  42.          
  43.          /**
  44.           * CREAMOS EL CONTENIDO DEL PANEL CON FILA FIJA
  45.           */
  46.          
  47.          //creamos el modelo de la tabla móbil
  48.          modelo = new DefaultTableModel(data, column); 
  49.          
  50.          //creamos la tabla de elementos móbiles
  51.          table = new JTable(modelo);
  52.          table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  53.          table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  54.          
  55.         /* creamos modelo de la tabla fija del panel "pFijo" */
  56.         AbstractTableModel fixedModel = new AbstractTableModel() {
  57.             public int getColumnCount() {
  58.                 return column.length;
  59.             }
  60.             public int getRowCount() {
  61.                 return 1;
  62.             }      
  63.             public Object getValueAt(int row, int col) {
  64.                 return 1;   //fijo todos los valores a 1 para el ejemplo
  65.             }
  66.         };
  67.  
  68.         /* creamos tabla fija del panel "pFijo" */
  69.         fixedTable = new JTable(fixedModel);
  70.         fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  71.         fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  72.        
  73.         // creamos el Scroll de los elementos móbiles del panel "pFijo" con "table"
  74.         mainScroll = new JScrollPane(table){
  75.             public void setColumnHeaderView(Component view) {
  76.                 //No muestra la cabecera en la tabla
  77.             }
  78.         };
  79.         mainScroll.setPreferredSize(new Dimension(400, 100));
  80.         mainScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  81.  
  82.         /* creamos el Scroll de la tabla fija (muestra la cabecera) */
  83.         fixedScroll = new JScrollPane(fixedTable);
  84.         fixedScroll.setPreferredSize(new Dimension(400, 37));
  85.        
  86.         /* la tabla fija no muestra nunca el scroll horizontal */
  87.         fixedScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  88.        
  89.         /* para poner un cuadrado gris donde deberia ir el scroll vertical de la tabla fija */
  90.         fixedScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  91.        
  92.         JScrollBar bar = fixedScroll.getVerticalScrollBar();
  93.         JScrollBar dummyBar = new JScrollBar() {
  94.             public void paint(Graphics g) {
  95.             }
  96.         };
  97.         dummyBar.setPreferredSize(bar.getPreferredSize());
  98.         fixedScroll.setVerticalScrollBar(dummyBar);
  99.  
  100.         /* para mover con un solo scroll horizontal las dos tablas del panel "pFijo" */
  101.         final JScrollBar bar1 = mainScroll.getHorizontalScrollBar();
  102.         JScrollBar bar2 = fixedScroll.getHorizontalScrollBar();
  103.         bar1.addAdjustmentListener(new AdjustmentListener() {
  104.             public void adjustmentValueChanged(AdjustmentEvent e) {
  105.                 bar2.setValue(e.getValue());
  106.             }
  107.         });  
  108.        
  109.         //colocamos en el panel pFijo las dos tablas    
  110.         pFijo.add(mainScroll, BorderLayout.CENTER);
  111.         pFijo.add(fixedScroll, BorderLayout.NORTH);
  112.            
  113.         /**
  114.                     * CREAMOS BOTON Y LOS CAMBIOS AL PULSARLO
  115.        */
  116.         JPanel pBoton = new JPanel();
  117.         getContentPane().add(pBoton, BorderLayout.NORTH);
  118.         JRadioButton rdbtnBoton = new JRadioButton("Boton");
  119.         pBoton.add(rdbtnBoton);
  120.          
  121.         //al pulsar el boton
  122.         rdbtnBoton.addItemListener(new ItemListener() {
  123.             @Override
  124.             public void itemStateChanged(ItemEvent e) {
  125.                 if(e.getStateChange()==ItemEvent.SELECTED){
  126.                     /* si esta pulsado muestra el scroll sin elementos fijos */
  127.                     scroll.setViewportView(table);
  128.                     card.show(pCentral, "op1");                
  129.                 }else{
  130.                     /* Al deselecionar muestra la tabla el panel "pFijo" con las dos tablas (fija y movil)*/
  131.                     fixedScroll.setViewportView(fixedTable);
  132.                     mainScroll.setViewportView(table);
  133.                     card.show(pCentral, "op2");
  134.                 }
  135.             }
  136.         });        
  137.     }