Java의 Hashtable에서 jtable을 채우십시오
문제
사용자로부터 키를 얻고 해시 가능 (키에 의해 지정된 패턴)을 생성하는 함수가 있습니다. 해시 테이블을 만든 후 각 열이 키를 나타내고 모든 행이 키와 관련된 값을 나타 내기 위해 jtable을 채우고 싶습니다. 나는 모든 것을 시도했지만이 일을 얻을 수 없었습니다. 사용자로부터 입력해야하므로 생성자 내에서 테이블을 만들지 않습니다.
해결책
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"
다른 팁
먼저 피하십시오 Hashtable
, 똑바로 가십시오 Map
. 이 경우 두 가지 잠재적 표준 구현이 필요합니다. LinkedHashMap
항목이 추가 된 순서를 유지할 수 있습니다. TreeMap
, ㅏ SortedMap
/NavigableMap
, 결과를 정렬합니다 (순서는 Comparator
. 또는 당신은 형태를 원할 수도 있습니다 Map
그 화재 사건 또는 또한 a 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
그리고 a TableModel
. 당신은 a Map
이벤트를 해고하고 a TableModel
그것은 적응합니다 Map
(비록 주목하지만 Map
인덱스를 기반으로 무작위 액세스가 없으므로 큰 맵의 경우 영리하거나 느리게해야합니다).
다른 방법으로 더 간단한 접근 방식은 데이터를 DefaultTableModel
그리고 사용하지 않습니다 Map
조금도.