我有一個函數從用戶獲取一個鍵並生成一個Hashtable(在由鍵指定的模式上)。在創建一個Hashtable後,我想填充一個JTable,以便每一列代表一個鍵,每一行代表與該鍵相關的值。我嘗試了一切,但無法完成這項工作。我不是從構造函數中創建表,因爲我需要從用戶那裏獲得輸入。從Java中的散列表填充JTable
2
A
回答
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
這個預填充模型
(免責聲明:。我不噸測試或編譯這個代碼。)
要保持Map
和TableModel
同步更多的代碼。通常最好儘可能避免重複狀態。寫一個自己公開爲Map
和TableModel
的課程。有一個Map
引發事件,TableModel
可以更改Map
(儘管請注意Map
沒有基於索引的隨機訪問,因此對於大型地圖您需要更聰明或緩慢)。
換一種方式,更簡單的方法是將數據直接添加到DefaultTableModel
,而不是使用Map
。
相關問題
- 1. Java jtable從列表中填充
- 2. 填充的JTable從陣列
- 3. 使用列表填充jTable
- 4. 使用列表填充JTable
- 5. 在JAVA中填充jTable
- 6. 填充的JTable從ArrayList中
- 7. 從postgresql填充jTable
- 8. 散列表的JTable?
- 9. Java Swing製作JTable列填充JScrollPane
- 10. 填充JTable的第一列
- 11. 填充的JComboBox從JTable的
- 12. Java JTable不填充DefaultTableModel
- 13. 使用arraylist填充java中的JTable
- 14. 從數據庫填充JTable
- 15. 從Swingworker線程填充jTable
- 16. java的填充值列表
- 17. JTable填充類
- 18. 用多個列表數據填充JTable行java
- 19. 從列表中填充DataFormComboBoxField
- 20. 從列表中填充WrapPanel
- 21. 定義時填充散列表
- 22. 不使用太多填充散列表
- 23. 填充MD5散列算法
- 24. 將JTable行填充爲Java中的JTextFields從mysql
- 25. 從jtable中的列中填充組合框
- 26. 在循環中從數組填充jtable
- 27. 填充@select下拉列表中的Java
- 28. 用零填充列表中的Java
- 29. 填充JTable中使用MySQL
- 30. 向量填充JTable?