TableRowColumnTest.java Source code

Java tutorial

Introduction

Here is the source code for TableRowColumnTest.java

Source

/*
 This program is a part of the companion code for Core Java 8th ed.
 (http://horstmann.com/corejava)
    
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
    
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
    
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;

import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * This program demonstrates how to work with rows and columns in a table.
 * 
 * @version 1.20 2007-08-01
 * @author Cay Horstmann
 */
public class TableRowColumnTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new PlanetTableFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

/**
 * This frame contains a table of planet data.
 */
class PlanetTableFrame extends JFrame {
    public PlanetTableFrame() {
        setTitle("TableRowColumnTest");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        TableModel model = new DefaultTableModel(cells, columnNames) {
            public Class<?> getColumnClass(int c) {
                return cells[0][c].getClass();
            }
        };

        table = new JTable(model);

        table.setRowHeight(100);
        table.getColumnModel().getColumn(COLOR_COLUMN).setMinWidth(250);
        table.getColumnModel().getColumn(IMAGE_COLUMN).setMinWidth(100);

        final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        table.setRowSorter(sorter);
        sorter.setComparator(COLOR_COLUMN, new Comparator<Color>() {
            public int compare(Color c1, Color c2) {
                int d = c1.getBlue() - c2.getBlue();
                if (d != 0)
                    return d;
                d = c1.getGreen() - c2.getGreen();
                if (d != 0)
                    return d;
                return c1.getRed() - c2.getRed();
            }
        });
        sorter.setSortable(IMAGE_COLUMN, false);
        add(new JScrollPane(table), BorderLayout.CENTER);

        removedRowIndices = new HashSet<Integer>();
        removedColumns = new ArrayList<TableColumn>();

        final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() {
            public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
                return !removedRowIndices.contains(entry.getIdentifier());
            }
        };

        // create menu

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu selectionMenu = new JMenu("Selection");
        menuBar.add(selectionMenu);

        rowsItem = new JCheckBoxMenuItem("Rows");
        columnsItem = new JCheckBoxMenuItem("Columns");
        cellsItem = new JCheckBoxMenuItem("Cells");

        rowsItem.setSelected(table.getRowSelectionAllowed());
        columnsItem.setSelected(table.getColumnSelectionAllowed());
        cellsItem.setSelected(table.getCellSelectionEnabled());

        rowsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                table.clearSelection();
                table.setRowSelectionAllowed(rowsItem.isSelected());
                updateCheckboxMenuItems();
            }
        });
        selectionMenu.add(rowsItem);

        columnsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                table.clearSelection();
                table.setColumnSelectionAllowed(columnsItem.isSelected());
                updateCheckboxMenuItems();
            }
        });
        selectionMenu.add(columnsItem);

        cellsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                table.clearSelection();
                table.setCellSelectionEnabled(cellsItem.isSelected());
                updateCheckboxMenuItems();
            }
        });
        selectionMenu.add(cellsItem);

        JMenu tableMenu = new JMenu("Edit");
        menuBar.add(tableMenu);

        JMenuItem hideColumnsItem = new JMenuItem("Hide Columns");
        hideColumnsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                int[] selected = table.getSelectedColumns();
                TableColumnModel columnModel = table.getColumnModel();

                // remove columns from view, starting at the last
                // index so that column numbers aren't affected

                for (int i = selected.length - 1; i >= 0; i--) {
                    TableColumn column = columnModel.getColumn(selected[i]);
                    table.removeColumn(column);

                    // store removed columns for "show columns" command

                    removedColumns.add(column);
                }
            }
        });
        tableMenu.add(hideColumnsItem);

        JMenuItem showColumnsItem = new JMenuItem("Show Columns");
        showColumnsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                // restore all removed columns
                for (TableColumn tc : removedColumns)
                    table.addColumn(tc);
                removedColumns.clear();
            }
        });
        tableMenu.add(showColumnsItem);

        JMenuItem hideRowsItem = new JMenuItem("Hide Rows");
        hideRowsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                int[] selected = table.getSelectedRows();
                for (int i : selected)
                    removedRowIndices.add(table.convertRowIndexToModel(i));
                sorter.setRowFilter(filter);
            }
        });
        tableMenu.add(hideRowsItem);

        JMenuItem showRowsItem = new JMenuItem("Show Rows");
        showRowsItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                removedRowIndices.clear();
                sorter.setRowFilter(filter);
            }
        });
        tableMenu.add(showRowsItem);

        JMenuItem printSelectionItem = new JMenuItem("Print Selection");
        printSelectionItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                int[] selected = table.getSelectedRows();
                System.out.println("Selected rows: " + Arrays.toString(selected));
                selected = table.getSelectedColumns();
                System.out.println("Selected columns: " + Arrays.toString(selected));
            }
        });
        tableMenu.add(printSelectionItem);
    }

    private void updateCheckboxMenuItems() {
        rowsItem.setSelected(table.getRowSelectionAllowed());
        columnsItem.setSelected(table.getColumnSelectionAllowed());
        cellsItem.setSelected(table.getCellSelectionEnabled());
    }

    private Object[][] cells = { { "Mercury", 2440.0, 0, false, Color.YELLOW, new ImageIcon("Mercury.gif") },
            { "Venus", 6052.0, 0, false, Color.YELLOW, new ImageIcon("Venus.gif") },
            { "Earth", 6378.0, 1, false, Color.BLUE, new ImageIcon("Earth.gif") },
            { "Mars", 3397.0, 2, false, Color.RED, new ImageIcon("Mars.gif") },
            { "Jupiter", 71492.0, 16, true, Color.ORANGE, new ImageIcon("Jupiter.gif") },
            { "Saturn", 60268.0, 18, true, Color.ORANGE, new ImageIcon("Saturn.gif") },
            { "Uranus", 25559.0, 17, true, Color.BLUE, new ImageIcon("Uranus.gif") },
            { "Neptune", 24766.0, 8, true, Color.BLUE, new ImageIcon("Neptune.gif") },
            { "Pluto", 1137.0, 1, false, Color.BLACK, new ImageIcon("Pluto.gif") } };

    private String[] columnNames = { "Planet", "Radius", "Moons", "Gaseous", "Color", "Image" };

    public static final int COLOR_COLUMN = 4;

    public static final int IMAGE_COLUMN = 5;

    private JTable table;

    private HashSet<Integer> removedRowIndices;

    private ArrayList<TableColumn> removedColumns;

    private JCheckBoxMenuItem rowsItem;

    private JCheckBoxMenuItem columnsItem;

    private JCheckBoxMenuItem cellsItem;

    private static final int DEFAULT_WIDTH = 600;

    private static final int DEFAULT_HEIGHT = 500;
}