【问题标题】:Populate JTable from a Hashtable in Java从 Java 中的 Hashtable 填充 JTable
【发布时间】:2010-09-22 11:30:31
【问题描述】:

我有一个函数,它从用户那里获取一个密钥并生成一个哈希表(在密钥指定的模式上)。创建 Hashtable 后,我想填充一个 JTable,以便每一列代表一个键,每一行代表与键关联的值。我尝试了一切,但无法完成这项工作。我不是在构造函数中创建表,因为我需要从用户那里获取输入。

【问题讨论】:

    标签: java swing hashtable jtable


    【解决方案1】:

    How to Use Tables: Creating a Table Model

    使用的 JTable 构造函数 SimpleTableDemo 创建它的表 代码如下:

    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"
    

    【讨论】:

      【解决方案2】:

      首先,避开Hashtable,直奔Map。在这种情况下,您可能需要两个潜在的标准实现:LinkedHashMap 可以保留添加条目的顺序; TreeMapSortedMap/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 和适应MapTableModel 来更加脱节(尽管请注意Map 没有基于索引的随机访问,因此您需要更聪明或大地图慢)。

      换一种方式,更简单的方法是将数据直接添加到DefaultTableModel,而根本不使用Map

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2015-06-17
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        相关资源
        最近更新 更多