Frage

I haben eine Funktion, die einen Schlüssel von dem Benutzer erhält und erzeugt ein Hashtable (auf einem Muster, das durch den Schlüssel spezifiziert). Nach einer Hashtable zu schaffen, würde Ich mag eine JTable füllen, so dass jede jede Spalte einen Schlüssel darstellt, und alle Zeilen darstellen, die mit dem Schlüssel verknüpften Werte. Ich habe alles versucht, konnte aber nicht, diese Arbeit bekommen. Ich bin nicht in die Tabelle aus dem Konstruktor erstellen, wie ich eine Eingabe vom Benutzer erhalten muß.

War es hilfreich?

Lösung

Siehe Wie Tabellen verwenden: Erstellen einer Tabelle Modell .

  

Der JTable Konstruktor verwendet von   SimpleTableDemo schafft seine Tabelle   Modell mit Code wie folgt:

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);
    }
}

Sie haben im Grunde Ihre Hash-Tabelle in der oben beschriebenen Weise zu wickeln. Hier ist ein Beispiel.

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"

Andere Tipps

Zum einen vermeiden Hashtable, geradeaus für Map. In diesem Fall gibt es zwei mögliche Standardimplementierungen Sie mights wollen: LinkedHashMap die Reihenfolge beibehalten kann, dass die Einträge hinzugefügt wurden; TreeMap, ein SortedMap / NavigableMap, werden die Ergebnisse sortiert werden (Reihenfolge von denen durch eine Comparator bestimmt werden kann. Alternativ Sie eine Form von Map wollen könnte, dass Feuer Ereignisse oder stellt auch ein TableModel.

Wenn Sie eine einmalige Umstellung von der Map Tabelle wollen, dann ist es ziemlich einfach.

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;
}

Dann erstellen Sie einfach die JTable mit diesem vorausgefüllt Modell.

(Disclaimer:. Ich nicht getestet haben oder so viel wie diesen Code kompiliert)

Um die Map zu halten und TableModel synchronisiert ist mehr Code. Im Allgemeinen ist es am besten zu vermeiden Zustand wo auch immer möglich, zu duplizieren. Schreiben Sie eine Klasse, die sich sowohl als Map und einem TableModel aussetzt. Sie könnten mehr disjunkte gehen durch eine Map hat, die Ereignisse und eine TableModel feuert, die die Map passt (obwohl beachten Sie, dass Map nicht zufällig Zugriff auf Index basiert hat, so dass Sie iether klug oder langsam für große Karten sein müssen).

in die andere Richtung, ein einfacher Ansatz wäre, die Daten direkt zu einem DefaultTableModel hinzuzufügen und keine Map überhaupt verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top