java/JFTable/src/cz/frantovo/gui/tabulky/JTable.java
author František Kučera <franta-hg@frantovo.cz>
Sat, 28 Feb 2009 17:11:20 +0100
changeset 3 74211841e25c
parent 2 29fb34084b12
permissions -rwxr-xr-x
Naformátování zdrojového kódu
franta-hg@0
     1
package cz.frantovo.gui.tabulky;
franta-hg@0
     2
franta-hg@0
     3
import java.awt.Point;
franta-hg@0
     4
import java.awt.event.MouseEvent;
franta-hg@0
     5
franta-hg@0
     6
import javax.swing.ImageIcon;
franta-hg@0
     7
import javax.swing.table.TableModel;
franta-hg@0
     8
franta-hg@0
     9
/**
franta-hg@2
    10
 * <p>Tato třída umožňuje jednoduchým způsobem přidat vašim tabulkám funkci
franta-hg@2
    11
 * řazení. Stačí ve vaší třídě nahradit: <br>
franta-hg@2
    12
 * "import javax.swing.JTable;"<br>
franta-hg@2
    13
 * tímto importem: "import cz.frantovo.gui.tabulky.JTable;"<br>
franta-hg@2
    14
 * </p>
franta-hg@2
    15
 * <p>Pomocí klávesy ctrl jde řadit podle více sloupců</p>
franta-hg@2
    16
 * <p>Také přidává funkci zobrazování tooltipu (zobrazuje obsah buňky)</p>
franta-hg@0
    17
 * 
franta-hg@2
    18
 * <p>Protože třídící model a skutečný model obsahují řádky v jiném pořadí,
franta-hg@2
    19
 * je potřeba přepočítat index získaný metodou getSelectedRow() na index ve skutečném modelu</p>
franta-hg@2
    20
 * <p>
franta-hg@2
    21
 * k tomu sloužá tento postup:</p>
franta-hg@2
    22
 * <pre>
franta-hg@2
    23
 * int r = jTable1.getSelectedRow();
franta-hg@2
    24
 * int rr = ((TableSorterModel)tabulka.getModel()).modelIndex(r);
franta-hg@2
    25
 * </pre>
franta-hg@2
    26
 * <p>rr je potom index řádku ve skutečném modelu.</p>
franta-hg@0
    27
 * 
franta-hg@0
    28
 * @author František Kučera
franta-hg@0
    29
 */
franta-hg@0
    30
public class JTable extends javax.swing.JTable {
franta-hg@0
    31
franta-hg@3
    32
    private static final long serialVersionUID = -5133441062459764995L;
franta-hg@3
    33
    private TableSorterModel tableSorterModel;
franta-hg@3
    34
    private TableModel realTableModel;
franta-hg@3
    35
    private boolean showTooltips = false;
franta-hg@0
    36
franta-hg@3
    37
    public boolean isShowTooltips() {
franta-hg@3
    38
        return showTooltips;
franta-hg@3
    39
    }
franta-hg@0
    40
franta-hg@3
    41
    /** Nastavuje, zda se mají zobrazovat tooltipy zobrazující obsah buňky */
franta-hg@3
    42
    public void setShowTooltips(boolean showTooltips) {
franta-hg@3
    43
        this.showTooltips = showTooltips;
franta-hg@3
    44
    }
franta-hg@0
    45
franta-hg@3
    46
    /**
franta-hg@3
    47
     * Nastaví TableModel a zabalí ho do TableSorterModelu, tabulka tím
franta-hg@3
    48
     * získá schopnost řazení řádků
franta-hg@3
    49
     */
franta-hg@3
    50
    @Override
franta-hg@3
    51
    public void setModel(TableModel dataModel) {
franta-hg@3
    52
        realTableModel = dataModel;
franta-hg@3
    53
        tableSorterModel = new TableSorterModel(dataModel);
franta-hg@0
    54
franta-hg@3
    55
        tableSorterModel.setTableHeader(getTableHeader());
franta-hg@3
    56
franta-hg@3
    57
        super.setModel(tableSorterModel);
franta-hg@3
    58
    }
franta-hg@3
    59
franta-hg@3
    60
    /**
franta-hg@3
    61
     * @return TableModel, která obsahuje data. Není tedy zabalen do
franta-hg@3
    62
     *         TableSorterModelu
franta-hg@3
    63
     */
franta-hg@3
    64
    public TableModel getRealTableModel() {
franta-hg@3
    65
        return realTableModel;
franta-hg@3
    66
    }
franta-hg@3
    67
franta-hg@3
    68
    /**
franta-hg@3
    69
     * @return TableSorterModel, který obaluje skutečný TableModel, který
franta-hg@3
    70
     *         obsahuje data. TableSorterModel slouží pouze k řazení položek
franta-hg@3
    71
     */
franta-hg@3
    72
    @Override
franta-hg@3
    73
    public TableModel getModel() {
franta-hg@3
    74
        return super.getModel();
franta-hg@3
    75
    }
franta-hg@3
    76
franta-hg@3
    77
    /**
franta-hg@3
    78
     * Pokud je nastaveno showTooltips, zobrazuje v tooltipu obsah buňky pod
franta-hg@3
    79
     * myší (hodí se, pokud je obsah buňky příliš dlouhý). Pokud buňka
franta-hg@3
    80
     * obsahuje ImageIcon, pak tooltip zobrazuje ImageIcon.getDescription()
franta-hg@3
    81
     */
franta-hg@3
    82
    @Override
franta-hg@3
    83
    public String getToolTipText(MouseEvent event) {
franta-hg@3
    84
        if (showTooltips) {
franta-hg@3
    85
            Point p = event.getPoint();
franta-hg@3
    86
            int col = columnAtPoint(p);
franta-hg@3
    87
            int rw = rowAtPoint(p);
franta-hg@3
    88
            if (col >= 0 && rw >= 0) {
franta-hg@3
    89
                Object o = getValueAt(rw,
franta-hg@3
    90
                        col);
franta-hg@3
    91
                if (o != null) {
franta-hg@3
    92
                    if (o instanceof ImageIcon) {
franta-hg@3
    93
                        return ((ImageIcon) o).getDescription();
franta-hg@3
    94
                    } else {
franta-hg@3
    95
                        return o.toString();
franta-hg@3
    96
                    }
franta-hg@3
    97
                }
franta-hg@3
    98
            }
franta-hg@3
    99
            return super.getToolTipText();
franta-hg@3
   100
        } else {
franta-hg@3
   101
            return super.getToolTipText();
franta-hg@0
   102
        }
franta-hg@3
   103
    }
franta-hg@0
   104
}