2008-11-15 100 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