Question

J'ai une fonction qui obtient une clé de l'utilisateur et génère une table de hachage (sur un modèle spécifié par la clé). Après avoir créé une table de hachage, j'aimerais renseigner une table JTable de sorte que chaque colonne représente une clé et chaque ligne représente les valeurs associées à la clé. J'ai tout essayé mais je n'ai pas pu obtenir ce travail. Je ne crée pas la table à partir du constructeur car je dois obtenir les informations de l'utilisateur.

Était-ce utile?

La solution

Voir Comment utiliser les tables: Créer une table Modèle .

  

Le constructeur JTable utilisé par   SimpleTableDemo crée sa table   modèle avec un code comme celui-ci:

new AbstractTableModel() {
    public String getColumnName(int col) {
        return columnNames[col].toString();
    }
    public int getRowCount() { return rowData.length; }
    public int getColumnCount() { return columnNames.length; }
    public Object getValueAt(int row, int col) {
        return rowData[row][col];
    }
    public boolean isCellEditable(int row, int col)
        { return true; }
    public void setValueAt(Object value, int row, int col) {
        rowData[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}

Vous devez essentiellement envelopper votre hashtable de la manière ci-dessus. Voici un exemple.

package eed3si9n.hashtabletable;

import java.awt.BorderLayout;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.JButton;
import java.awt.Dimension;

public class MainForm extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;  //  @jve:decl-index=0:visual-constraint="23,38"
    private JScrollPane m_scrollPane = null;
    private JTable m_table = null;
    private Hashtable<String, String> m_hash = null;
    private JButton m_btnAdd = null;    

    /**
     * This is the default constructor
     */
    public MainForm() {
        super();
        initialize();
        m_hash = new Hashtable<String, String>();
        m_hash.put("Dog", "Bow");
    }

    private void onButtonPressed() {
        m_hash.put("Cow", "Moo");
        m_table.revalidate();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(409, 290);
        this.setTitle("JFrame");
        this.setContentPane(getJContentPane());
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.setSize(new Dimension(500, 500));
            jContentPane.setPreferredSize(new Dimension(500, 500));
            jContentPane.add(getM_scrollPane(), BorderLayout.NORTH);
            jContentPane.add(getM_btnAdd(), BorderLayout.SOUTH);
        }
        return jContentPane;
    }

    /**
     * This method initializes m_scrollPane 
     *  
     * @return javax.swing.JScrollPane  
     */
    private JScrollPane getM_scrollPane() {
        if (m_scrollPane == null) {
            m_scrollPane = new JScrollPane();
            m_scrollPane.setViewportView(getM_table());
        }
        return m_scrollPane;
    }

    /**
     * This method initializes m_table  
     *  
     * @return javax.swing.JTable   
     */
    private JTable getM_table() {
        if (m_table == null) {
            m_table = new JTable();
            m_table.setModel(new AbstractTableModel(){
    private static final long serialVersionUID = 1L;

    public int getColumnCount() {
        return 2;
    }

    public int getRowCount() {
        return m_hash.size();
    }

    public String getColumnName(int column) {
        if (column == 0) {
            return "Animal";
        } else {
            return "Sound";
        }
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        if (columnIndex == 0) {
            return getKey(rowIndex);
        } else {
            return m_hash.get(getKey(rowIndex));
        } // if-else

    }

    private String getKey(int a_index) {
        String retval = "";
        Enumeration<String> e = m_hash.keys();
        for (int i = 0; i < a_index + 1; i++) {
            retval = e.nextElement();
        } // for

        return retval;
    }

            });
        }
        return m_table;
    }

    /**
     * This method initializes m_btnAdd 
     *  
     * @return javax.swing.JButton  
     */
    private JButton getM_btnAdd() {
        if (m_btnAdd == null) {
            m_btnAdd = new JButton();
            m_btnAdd.setPreferredSize(new Dimension(34, 30));
            m_btnAdd.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    onButtonPressed();
                }
            });
        }
        return m_btnAdd;
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                MainForm frame = new MainForm();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(500, 500);
                frame.setVisible(true);
            }
        });
    }
}  //  @jve:decl-index=0:visual-constraint="10,10"

Autres conseils

Tout d’abord, évitez Hashtable , continuez tout droit pour Map . Dans ce cas, vous souhaiterez peut-être utiliser deux implémentations standard standard: LinkedHashMap peut conserver l'ordre dans lequel les entrées ont été ajoutées; TreeMap , un SortedMap / NavigableMap , triera les résultats (leur ordre peut être déterminé par un Comparator . Vous pouvez également utiliser une forme de Carte qui déclenche des événements ou fournit également un TableModel .

Si vous souhaitez effectuer une conversion unique de la Carte vers le tableau, la procédure est relativement simple.

public static TableModel toTableModel(Map<?,?> map) {
    DefaultTableModel model = new DefaultTableModel(
        new Object[] { "Key", "Value" }, 0
    );
    for (Map.Entry<?,?> entry : map) {
        model.addRow(new Object[] { entry.getKey(), entry.getValue() });
    }
    return model;
}

Créez simplement la JTable avec ce modèle pré-rempli.

(Avertissement: je n'ai pas testé ou compilé ce code.)

Pour que les codes Map et TableModel soient synchronisés, il faut plus de code. En règle générale, il est préférable d'éviter la duplication autant que possible. Ecrivez une classe qui se présente sous forme de Map et de TableModel . Vous pourriez avoir plus de discordances en ayant un Map qui déclenche des événements et un TableModel qui adapte le Map (bien noter que Map n'a pas d'accès aléatoire basé sur l'index, vous devez donc être intelligent ou lent pour les grandes cartes).

En sens inverse, une approche plus simple consisterait à ajouter les données directement à un DefaultTableModel et à ne pas utiliser de Carte .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top