2008-11-15 3 views
2

У меня есть функция, которая получает ключ от пользователя и генерирует Hashtable (по шаблону, указанному ключом). После создания Hashtable я хотел бы заполнить JTable, чтобы каждый столбец представлял ключ, и каждая строка представляет значения, связанные с ключом. Я пробовал все, но не мог получить эту работу. Я не создаю таблицу внутри конструктора, так как мне нужно получить вход от пользователя.Заполнение JTable из Hashtable в Java

ответ

2

См. 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); 
    } 
} 

Вы в основном должны обернуть Hashtable вышеуказанным способом. Вот пример.

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 с этой предварительной заселенной модели

(Отказ от ответственности:.. Я не t) или так, как скомпилирован этот код.)

Для сохранения Map и TableModel синхронизирован код. Как правило, лучше избегать дублирования состояния. Напишите класс, который представляет собой как Map, так и TableModel. Вы можете пойти больше disjoint, имея Map, который вызывает события, и TableModel, который адаптирует Map (хотя обратите внимание, что Map не имеет произвольного доступа по индексу, поэтому вам нужно быть умным или медленным для больших карт).

Иными словами, более простой подход заключается в том, чтобы добавить данные прямо к DefaultTableModel и вообще не использовать Map.

Смежные вопросы