2008-11-15 89 views
2

我有一個函數從用戶獲取一個鍵並生成一個Hashtable(在由鍵指定的模式上)。在創建一個Hashtable後,我想填充一個JTable,以便每一列代表一個鍵,每一行代表與該鍵相關的值。我嘗試了一切,但無法完成這項工作。我不是從構造函數中創建表,因爲我需要從用戶那裏獲得輸入。從Java中的散列表填充JTable

回答

2

請參閱How to Use Tables: Creating a Table Model

通過 SimpleTableDemo使用JTable的構造函數創建其表 模型,這樣的代碼:

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

你基本上來包裝你的哈希表以上述方式。這是一個例子。

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" 
1

首先,避免Hashtable,直行Map。在這種情況下,您需要兩個潛在的標準實現:LinkedHashMap可以保留條目的添加順序; TreeMap,一個SortedMap/NavigableMap,將結果(順序都可以由一個Comparator確定。另外,你可能想的Map火災事件的形式或還提供了排序TableModel

如果你想一次性轉換從Map到表中,那麼它是非常簡單的

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

然後,只需創建JTable這個預填充模型

(免責聲明:。我不噸測試或編譯這個代碼。)

要保持MapTableModel同步更多的代碼。通常最好儘可能避免重複狀態。寫一個自己公開爲MapTableModel的課程。有一個Map引發事件,TableModel可以更改Map(儘管請注意Map沒有基於索引的隨機訪問,因此對於大型地圖您需要更聰明或緩慢)。

換一種方式,更簡單的方法是將數據直接添加到DefaultTableModel,而不是使用Map