domingo, 3 de abril de 2011

Tabla en Swing Java - Codigo ejemplo (12.02.00)



TestTable.java

package pe.edu.uni.st232u;

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TestTable extends JPanel {
    private JTableModel tableModel;
   
    public TestTable() {
      //indicar el layout del panel
        super(new GridLayout(1,0));

        //crear la tabla
        tableModel = new JTableModel();
        tableModel.printTableModel(); //opcional
        JTable table = new JTable(tableModel);
        table.setPreferredScrollableViewportSize(new Dimension(500, 90));

        //configurar listener de eventos a la tabla
        JTableModelListener listener = new JTableModelListener();
        table.getModel().addTableModelListener(listener);
       
        //crear un panel con scroll y anexarle la tabla.
        JScrollPane scrollPane = new JScrollPane(table);

        //Agregar un combo box como editor de la columna Deporte.
        agregarComboBox(table, table.getColumnModel().getColumn(2));

        //agregar el panel con scroll al panel principal.
        this.add(scrollPane);
    }
   
    public void agregarComboBox(JTable table, TableColumn column) {
        //definir un combo como editor de una columna
        JComboBox comboBox = new JComboBox();
        comboBox.addItem("Voleibol");
        comboBox.addItem("Tenis");
        comboBox.addItem("Surf");
        comboBox.addItem("Karate");
        comboBox.addItem("Ajedrez");
        comboBox.addItem("Ninguno");
        column.setCellEditor(new DefaultCellEditor(comboBox));
    }

    //Crear y mostrar la aplicacion
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                  crearAplicacion();
            }
        });
    }
    private static void crearAplicacion() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame;
       
        frame = new JFrame("TestTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TestTable panel = new TestTable();
        //panel.setOpaque(true);
        frame.setContentPane(panel);

        frame.pack();
        frame.setVisible(true);
    }

    public class JTableModel extends AbstractTableModel {
        private String[] columnNames = {"Nombres",
                                        "Apellidos",
                                        "Deporte",
                                        "# Años",
                                        "Vegetariano?"};
        private Object[][] data = {
            {"Gabriela", "Perez",
             "Voleibol", new Integer(15), new Boolean(false)},
            {"Emilio", "Cordova",
             "Ajedrez", new Integer(3), new Boolean(true)},
            {"Akío", "Tamashiro",
             "Karate", new Integer(5), new Boolean(false)},
            {"Sofía", "Mulanovich",
             "Surf", new Integer(10), new Boolean(true)},
            {"Luis", "Horna",
             "Tenis", new Integer(10), new Boolean(false)}
        };

        //retorna la cantidad de columnas
        public int getColumnCount() {
            return columnNames.length;
        }
        //retorna la cantidad de filas
        public int getRowCount() {
            return data.length;
        }
        //retorna el nombre de la columna
        public String getColumnName(int col) {
            return columnNames[col];
        }
        //retorna el objeto de una ubicacion
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        //En caso de tabla editable
        //determina la clase de cada columna
        //para la edicion por defecto (boolean)
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
        //En caso de tabla editable
        //determina las columnas a editar
        public boolean isCellEditable(int row, int col) {
            //la primera columna no sera editable
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }

        //En caso de tabla editable
        //debera implementarse el metodo setValueAt
        public void setValueAt(Object value, int row, int col) {
            data[row][col] = value;
            fireTableCellUpdated(row, col);
        }
        //muestra el contenido de la tabla
        private void printTableModel() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
            
            for (int i=0; i < numRows; i++) {
                System.out.print("    fila " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
        private void printRowModel(int numRow) {
            int numCols = getColumnCount();
                System.out.print("    fila " + numRow + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[numRow][j]);
                }
            System.out.println();
        }       
    }
   
    public class JTableModelListener implements TableModelListener {
      public void tableChanged(TableModelEvent e) {
         int row = e.getFirstRow();
         int column = e.getColumn();
         JTableModel tableModel = (JTableModel)e.getSource();
         String columnName = tableModel.getColumnName(column);
         Object data = tableModel.getValueAt(row, column);

         String mensaje = "--->fila "+row+" columna  "+column+": "+columnName+" = "+data.toString();
       
         System.out.println(mensaje);
         tableModel.printRowModel(row);
      }
    }
}

Compartir:

0 comentarios:

Publicar un comentario