1 votes

utilisation de JTables avec netbeans 6.1 aka Matisse

Avant de répondre : Oui, j'ai lu le tutoriel jtable sur le site de Sun. . Non, ça ne m'a pas aidé. Oui, je suis un idiot. S'il vous plaît, ne répondez pas avec une référence à ce document. . Ce qui m'intéresse plus particulièrement, c'est de savoir comment ajouter dynamiquement des lignes et des colonnes à ma Jtable via l'IDE Netbeans. J'ai déjà un objet qui contient un hashmap avec mes données. Je n'arrive pas à savoir où ou à quel objet je dois passer cet objet. Merci pour votre temps !

J'ai un vecteur qui contient une série (de longueur l) d'objets (chacun correspondant à une ligne). Comment puis-je faire en sorte que cet objet vectoriel s'affiche sur la JTable ?

2voto

Chris Jester-Young Points 102876

A JTable utilise un TableModel pour contenir ses données. Votre hachage/vecteur de données devra être adapté pour être utilisé ; vous pouvez écrire un fichier TableModel en utilisant le hachage/vecteur comme données de sauvegarde, ou, si vous ne mettez pas dynamiquement à jour le hachage/vecteur et n'avez pas besoin qu'il s'affiche automatiquement, vous pouvez simplement copier le tout dans une instance de DefaultTableModel et utilisez-la.

Si vous utilisez un adaptateur et mettez dynamiquement à jour le hachage/vecteur, n'oubliez pas que toutes les mises à jour doivent être effectuées dans le fil de distribution de l'événement :-)

1voto

coobird Points 70356

À titre d'illustration, voici des exemples d'utilisation de la fonction DefaultTableModel pour afficher vos données de HashMap et Vector s.

Voici un exemple de vidage de données à partir d'un fichier HashMap sur un DefaultTableModel qui est utilisé comme le TableModel d'un JTable .

import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class JTableExample extends JFrame
{
    private void makeGUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // HashMap with some data.
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // Create a DefaultTableModel, which will be used as the
        // model for the JTable.
        DefaultTableModel model = new DefaultTableModel();

        // Populate the model with data from HashMap.
        model.setColumnIdentifiers(new String[] {"key", "value"});

        for (String key : map.keySet())
            model.addRow(new Object[] {key, map.get(key)});

        // Make a JTable, using the DefaultTableModel we just made
        // as its model.
        JTable table = new JTable(model);

        this.getContentPane().add(table);
        this.setSize(200,200);
        this.setLocation(200,200);
        this.validate();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        new JTableExample().makeGUI();
    }
}

Pour l'utilisation d'un Vector pour inclure une colonne de données dans un JTable :

import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class JTableExample extends JFrame
{
    private void makeGUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Vector with data.
        Vector<String> v = new Vector<String>();
        v.add("first");
        v.add("second");

        // Create a DefaultTableModel, which will be used as the
        // model for the JTable.
        DefaultTableModel model = new DefaultTableModel();

        // Add a column of data from Vector into the model.
        model.addColumn("data", v);

        // Make a JTable, using the DefaultTableModel we just made
        // as its model.
        JTable table = new JTable(model);

        this.getContentPane().add(table);
        this.setSize(200,200);
        this.setLocation(200,200);
        this.validate();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        new JTableExample().makeGUI();
    }
}

Je dois admettre que les noms des colonnes n'apparaissent pas lorsque j'utilise les exemples ci-dessus (j'utilise généralement le format DefaultTableModel 's setDataVector ), donc si quelqu'un a des suggestions sur la façon de faire apparaître les noms des colonnes, qu'il le fasse :)

0voto

Chris Jester-Young Points 102876

À ajouter à ma réponse précédente Pour ce que ça vaut, j'ai écrit un modèle de table qui utilise (essentiellement) un ArrayList<Row> comme données de base, où Row est un HashMap<String, Object> en faisant correspondre les noms de colonnes aux valeurs.

Le tout représente environ 1500 lignes de code, bien que mon code puisse être excessif pour vos besoins, et que vous n'ayez probablement pas besoin d'écrire autant de code. Bonne continuation !

0voto

Juste un complément au post de coobird ; pour faire apparaître l'en-tête, j'ai fait ceci :

import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class JTableExample extends JFrame
{
    private void makeGUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // HashMap with some data.
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");

        // Create a DefaultTableModel, which will be used as the
        // model for the JTable.
        DefaultTableModel model = new DefaultTableModel();

        // Populate the model with data from HashMap.
        model.setColumnIdentifiers(new String[] {"key", "value"});

        for (String key : map.keySet())
                model.addRow(new Object[] {key, map.get(key)});

        // Make a JTable, using the DefaultTableModel we just made
        // as its model.
        JTable table = new JTable(model);

        this.getContentPane().add(new JScrollPane(table));
        this.setSize(200,200);
        this.setLocation(200,200);
        this.validate();
        this.setVisible(true);
    }

    public static void main(String[] args)
    {
        new JTableExample().makeGUI();
    }
}

Au fait, votre post a été très utile pour moi coobird, vous n'avez pas idée à quel point je vous suis reconnaissant !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X