UN TABLEUR EN SWING

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 12 mars 2012 à 06:14
novitski2012 Messages postés 1 Date d'inscription dimanche 6 mai 2012 Statut Membre Dernière intervention 29 mai 2012 - 29 mai 2012 à 18:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54131-un-tableur-en-swing

novitski2012 Messages postés 1 Date d'inscription dimanche 6 mai 2012 Statut Membre Dernière intervention 29 mai 2012
29 mai 2012 à 18:21
Bonsoir je voudrais Retourner le contenue de la case avec un Events avoir le texte de la cellule comment je dois faire
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
14 mars 2012 à 11:48
Ok, je jetterai un coup d'œil à l'occasion.
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
14 mars 2012 à 11:01
Si tu veux aller encore un peu plus loin, je t'invite à découvrir le site www.eteks.com. Tu y trouveras le tableur Jeks qui contient une bibliothèque de calcul de fonctions et d'expressions mathématiques. Les sources Java sont également incluses dans le téléchargement et c'est entièrement gratuit!

André
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
13 mars 2012 à 15:00
Ok, c'est pas grave.

En tout cas merci pour ton code.

a+
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
13 mars 2012 à 06:33
Ta description "Je n'utilise pas la classe JTable" n'explique pas pourquoi tu fais ce choix non classique. Alors je cherchais en vain le "truc spécial" qui ne serait pas possible avec JTable. Pardon, Julien, je ne voulais pas dire "tu es trop nul".
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
12 mars 2012 à 14:59
Ok, je m'incline. Je n'arrive jamais à utiliser les JTable, entre les TableModel, les TableHeader qui ont également un model, et les Renderer, je ne trouve jamais comment m'en sortir.

Je vais laisser la source telle qu'elle mais on est d'accord, ce que tu fais est préférable.

Par contre, le premier commentaire a tendance à m'énerver, c'est une reformulation de "tu es trop nul" et rien de tout ca n'est constructif.

Mais merci pour ton exemple qui lui est très constructif.
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 mars 2012 à 14:36
Eh bien, une JTable a une API par défaut pour afficher les en-têtes des colonnes. Il le fait en ajoutant la composante JTableHeader à la zone d'en-tête de colonne d'un JScrollPane. Bien qu'il n'y ait pas de composante dans l'API pour afficher les numéros de ligne, le JScrollPane prend également en charge une zone d'en-tête de ligne pour un composant en-0tête de ligne. Donc, tout ce que nous devons faire est de créer un composant en-tête de ligne et le problème est résolu. Exemple:

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

public class Lanceur1 {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTable t = new JTable(100, 30);
        t.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        JScrollPane scrollPane = new JScrollPane(t);
        JTable rowTable = new RowNumberTable(t);
        scrollPane.setRowHeaderView(rowTable);
        scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, rowTable.getTableHeader());
        f.add(scrollPane);
        f.setSize(300, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

class RowNumberTable extends JTable implements ChangeListener, PropertyChangeListener {

    private JTable main;

    public RowNumberTable(JTable table) {
        main = table;
        main.addPropertyChangeListener(this);
        setFocusable(false);
        setAutoCreateColumnsFromModel(false);
        setModel(main.getModel());
        setSelectionModel(main.getSelectionModel());
        TableColumn column = new TableColumn();
        column.setHeaderValue(" ");
        addColumn(column);
        column.setCellRenderer(new RowNumberRenderer());
        getColumnModel().getColumn(0).setPreferredWidth(50);
        setPreferredScrollableViewportSize(getPreferredSize());
    }

    @Override
    public void addNotify() {
        super.addNotify();
        Component c = getParent();
        //  Keep scrolling of the row table in sync with the main table.
        if (c instanceof JViewport) {
            JViewport viewport = (JViewport) c;
            viewport.addChangeListener(this);
        }
    }

    @Override
    public int getRowCount() {
        return main.getRowCount();
    }

    @Override
    public int getRowHeight(int row) {
        return main.getRowHeight(row);
    }

    @Override
    public Object getValueAt(int row, int column) {
        return Integer.toString(row + 1);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    @Override
    public void stateChanged(ChangeEvent e) {
        //  Keep the scrolling of the row table in sync with main table
        JViewport viewport = (JViewport) e.getSource();
        JScrollPane scrollPane = (JScrollPane) viewport.getParent();
        scrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
        repaint();
    }

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        //  Keep the row table in sync with the main table
        if ("selectionModel".equals(e.getPropertyName())) {
            setSelectionModel(main.getSelectionModel());
        }
        if ("model".equals(e.getPropertyName())) {
            setModel(main.getModel());
        }
        repaint();
    }

    private static class RowNumberRenderer extends DefaultTableCellRenderer {

        RowNumberRenderer() {
            setHorizontalAlignment(JLabel.CENTER);
        }

        @Override
        public Component getTableCellRendererComponent(
                JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (table != null) {
                JTableHeader header = table.getTableHeader();
                if (header != null) {
                    setForeground(header.getForeground());
                    setBackground(header.getBackground());
                    setFont(header.getFont());
                }
            }
            if (isSelected) {
                setFont(getFont().deriveFont(Font.BOLD));
            }
            setText((value == null) ? "" : value.toString());
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
            return this;
        }
    }
}


André
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
12 mars 2012 à 08:32
Pour comprendre où est la blague, essaye de reproduire ca avec une JTable et tu verras...
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
12 mars 2012 à 06:14
... et c'est où la blague?
Rejoignez-nous