/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cliente;

/**
 *
 * @author manix
 */

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JButton;
import javax.swing.table.AbstractTableModel;
import java.awt.Dimension;
import java.awt.Component;
import javax.swing.BoxLayout;
import java.text.MessageFormat;

public class ImprimirTabla extends JPanel 
                            implements java.awt.event.ActionListener {
    private boolean DEBUG = false;
    private JTable tabla;

    public ImprimirTabla() {
        super();
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        tabla = new JTable(new MyTableModel());
        tabla.setPreferredScrollableViewportSize(new Dimension(500, 70));
        tabla.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(tabla);

        add(scrollPane);

        JButton botonImprimir = new JButton("Print");
        botonImprimir.setAlignmentX(Component.CENTER_ALIGNMENT);
        botonImprimir.addActionListener(this);
        add(botonImprimir);

    }

    public void actionPerformed(java.awt.event.ActionEvent ignore) {
        MessageFormat encabezado = new MessageFormat("Page {0,number,integer}");
        try {
            tabla.print(JTable.PrintMode.FIT_WIDTH, encabezado, null);
        } catch (java.awt.print.PrinterException e) {
            System.err.format("No se puede imprimir %s%n", e.getMessage());
        }
    }

    class MyTableModel extends AbstractTableModel {
        private String[] nombreColumnas = {"Nombre",
                                "Apellido",
                                "Deporte",
                                "# de años",
                                "Vegetariano"};

        private Object[][] datos = {
            {"Mary", "Campione",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Sharon", "Zakhour",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Philip", "Milne",
             "Pool", new Integer(10), new Boolean(false)}
        };

        public int getColumnCount() {
            return nombreColumnas.length;
        }

        public int getRowCount() {
            return datos.length;
        }

        public String getColumnName(int col) {
            return nombreColumnas[col];
        }

        public Object getValueAt(int row, int col) {
            return datos[row][col];
        }

        /*
         * JTable usa este metodo para determinar el render de cada celda. 
         * Si no implementamos este metodo, entonces la
         * ultima columna tendra el formato de ("true"/"false")
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * No se necesita implementar este metodo a menos que su tabla sea
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }

        /*
         * No se necesita implementar este metodo a menos que su tabla sea
         * editable.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Estableciendo valor en " + row + "," + col
                                   + " a " + value
                                   + " (una instancia de "
                                   + value.getClass() + ")");
            }

            datos[row][col] = value;
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("Nuevo valor:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + datos[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame("Imprimir tabla");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        ImprimirTabla newContentPane = new ImprimirTabla();
        newContentPane.setOpaque(true); 
        frame.setContentPane(newContentPane);


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

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

