تعبئة JTable من جدول هاش في جاوة
سؤال
ولدي وظيفة التي تحصل على مفتاح من المستخدم ويقوم بإنشاء جدول هاش (على نمط محدد من قبل مفتاح). بعد إنشاء جدول هاش، وأود أن تعبئة JTable بحيث يمثل كل كل عمود مفتاح وكل الصفوف يمثل القيم المرتبطة المفتاح. حاولت كل شيء ولكن لا يمكن الحصول على هذا العمل. أنا لا إنشاء الجدول من داخل منشئ وأنا في حاجة للحصول على مدخلات من المستخدم.
المحلول
كيفية استخدام الجداول: إنشاء جدول نموذج .
<اقتباس فقرة>ومنشئ 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"
نصائح أخرى
أولا، تجنب 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
لا يكون الوصول العشوائي على أساس مؤشر، لذلك عليك أن تكون ذكية iether أو بطيئة للخرائط كبيرة).
والذهاب في الاتجاه الآخر، واتباع نهج أكثر بساطة سيكون لإضافة البيانات مباشرة إلى DefaultTableModel
وليس باستخدام Map
على الإطلاق.