如何在JTable中使用hashMap

我有一个hashMap,我希望它的数据可以在JTable中查看,但是我无法获得hashMap数量的列和行以及要显示的数据。我有一个hashmap,它以一个accountID作为键和一个学生的对象,其中每个学生都有他们的数据,如姓名,身份,年龄等,无论如何引用JTable文档,它说我需要int为行和列以及类型为Object的多维数组。 我该怎么做? 我可以将hashMap更改为multidimenion数组吗?

– 编辑我已经编辑了我的问题,所以它可以更清楚,我相当新的Java我真的没有得到你们发布的内容,特别是因为我正在做的工作与OO非常相关并且掌握OO概念是我最大的挑战,

/ 我有一个dataStorage类,注册用户被添加到HashMap中,其用户名的Key输入是getUser。 /

import java.util.*; public class DataStorage { HashMap students = new HashMap(); HashMap staffMembers = new HashMap(); //Default constructor public DataStorage(){ } public void addStaffMember(Staff aAcc) { staffMembers.put(aAcc.getUser(),aAcc); } public void addStudentMember(Student aAcc) { students.put(aAcc.getUser(),aAcc); } public Staff getStaffMember(String user) { return staffMembers.get(user); } public Student getStudent(String user) { return students.get(user); } public int getStudentRows() { return students.size(); } } 

/ ****这是一个延伸账户的学生class*** /

 public class Student extends Account { private String studentNRIC; private String diploma; private String gender; private double level; private int credits; private int age; private boolean partTime; private boolean havePc; private boolean haveChild; public Student(String n, String nr, String id, String dep, String user, String pass) { super(n, dep, user, pass, id); studentNRIC = nr; } public void setPartTime(boolean state) { if(state == true) { partTime = true; } else { partTime = false; } } public boolean getPartTime() { return partTime; } public void setHavePc(boolean state) { if(state == true) { havePc = true; } else { havePc = false; } } public boolean getHavePc() { return havePc; } public void setHaveChild(boolean state) { if(state == true) { haveChild = true; } else { haveChild = false; } } public boolean getHaveChild() { return haveChild; } public void setDiploma(String dip) { diploma = dip; } public String getDiploma() { return diploma; } public void setCredits(String cre) { credits = Integer.parseInt(cre); } public int getCredits() { return credits; } public void setGender(String g) { gender = g; } public String getGender() { return gender; } public void setAge(String a) { age = Integer.parseInt(a); } public int getAge() { return age; } public void setLevel(String lvl) { level = Double.parseDouble(lvl); } public double getLevel() { return level; } public void setStudentNRIC(String nr) { studentNRIC = nr; } public String getStudentNRIC() { return studentNRIC; } } 

/ ****这是一个帐户超类*** /

 public class Account { private String name; private String department; private String username; private String password; private String accountID; public Account() { } public Account(String nm,String dep,String user,String pass, String accID) { name = nm; department = dep; username = user; password = pass; accountID = accID; } public void setName(String nm) { name = nm; } public String getName() { return name; } public void setDep(String d) { department = d; } public String getDep() { return department; } public void setUser(String u) { username = u; } public String getUser() { return username; } public void setPass(String p) { password = p; } public String getPass() { return password; } public void setAccID(String a) { accountID = a; } public String getAccID() { return accountID; } } 

您有几种选择 。 我可能会构建自己的TableModel并将HashMap转换为List,但这需要accountID是Student的一部分,我无法判断它是否来自你的post。 因此创建多维数组可能更容易。 要做到这一点,你需要检查HashMap每个对象,为此我们将使用’循环’。

首先创建数组以保存您的数据:

 Object[][] tableData = new Object[students.keySet().size()][numberOfColumns]; 

将numberOfColumns替换为表所具有的列数。

 int index = 0; for (String key : students.keySet()) { Student student = students.get(key); tableData[index][0] = student.getXXX tableData[index][1] = student.getYYY tableData[index][2] = student.getZZZ // and so forth index++; } 

所以我们在这里做的是创建一个循环,它将检查学生HashMap中的每个键,并使用该键检索Student对象并使用正确的数据填充数组。

这是为了回答您的问题,但我建议您查看TableModel界面并围绕学生的HashMap构建一个。 更有男子气概:)

 public class HashMapToJtable { public static void main(String[] args) { final Map st=new TreeMap(); st.put("1","one"); st.put("2","two"); st.put("3","three"); JTable t=new JTable(toTableModel(st)); JPanel p=new JPanel(); p.add(t); JFrame f=new JFrame(); f.add(p); f.setSize(200,200); f.setVisible(true); } public static TableModel toTableModel(Map map) { DefaultTableModel model = new DefaultTableModel( new Object[] { "Key", "Value" }, 0 ); for (Map.Entry entry : map.entrySet()) { model.addRow(new Object[] { entry.getKey(), entry.getValue() }); } return model; } } 

这是一个用于从地图填充Jtable的示例代码。为了您的目的,您必须覆盖 Student和Staff类中的toString方法。

为什么不创建一个以JTable所需的方式实现接口的Object (一个Object数组),并为您现有的Student地图提供一个桥梁? 因此,您可以保留显然适合您的现有数据结构,并且您只需提供适配器以获得视图(JTable)。

从链接:

通过在使用原始接口时向客户端提供其接口,适配器允许类通常无法工作,因为接口不兼容。 适配器将对其接口的调用转换为对原始接口的调用,并且执行此操作所需的代码量通常很小。 适配器还负责将数据转换为适当的forms。

我会尽量改变工作数据结构以适应特定的GUI组件(如果在以后的阶段你想通过HTML或类似的方式显示会发生什么),但是当需求出现时适应每个视图。

关闭Emil的答案,但支持旧版本(使用Java 1.3测试)。

 import javax.swing.*; import java.util.*; import javax.swing.table.*; public class HashMapToJtable { public static void main(String[] args) { final Map st = new TreeMap(); st.put("1","one"); st.put("2","two"); st.put("3","three"); JTable t=new JTable(toTableModel(st)); JPanel p=new JPanel(); p.add(t); JFrame f=new JFrame(); f.add(p); f.setSize(200,200); f.setVisible(true); } public static TableModel toTableModel(Map map) { DefaultTableModel model = new DefaultTableModel ( new Object[] { "Key", "Value" }, 0 ); for (Iterator it = map.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); model.addRow(new Object[] { entry.getKey(), entry.getValue() }); } return model; } } 

这样做的方法是为学生注册表(也称为SortedMap)实现TableModel接口。 TableModel是Swing JTable如何期望其数据的表模型表示。 TableModel接口提供了提供该数据的完全灵活性。

创建该实现后,直接创建JTable

 // As StudentRegistration class new JTable(new StudentTableModel(studentRegistration)); // Or as SortedMap new JTable(new StudentTableModel(students)); 

在这种情况下,我希望不直接给出普通的SortedMap ,而是一个StudentRegistration的实例,它包含一个SortedMap

 /** * Models the {@link Student} entries as a Swing TableModel. */ final public class StudentTableModel implements TableModel { /** The TableModel column names. */ public final String columnNames[] = new String[] { "Name", "Identification", "Age" }; /** The list of TableModelListeners. */ private final ArrayList tableModelListenerList = new ArrayList(); /** The manager containing all the Student instances. */ private final StudentRegistration register; public StudentTableModel(StudentRegistration register) { super(); this.register = register; } public Class getColumnClass(int columnIndex) { return null; } public int getColumnCount() { return columnNames.length; } public String getColumnName(int columnIndex) { return (columnIndex < columnNames.length) ? columnNames[columnIndex] : null; } public int getRowCount() { return register.getStudents().size(); } public Object getValueAt(int rowIndex, int columnIndex) { // One solution String identification = register.getStudentIds().toArray()[rowIndex]; Student student = register.getStudent(identification); // Other option SortedMap studentMap = register.getStudents(); String[] studentIdArray = studentMap.keySet().toArray(new String[studentMap.keySet().size()]); Student student = studentMap.get(studentIdArray[rowIndex]); final Object result; switch (columnIndex) { case 0: result = student.getName(); break; case 1: result = student.getIdentification(); break; case 2: result = student.getAge(); break; default: result = null; } return result; } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } public void setValueAt(Object value, int rowIndex, int columnIndex) { // Just ignore, model is read only. } public void addTableModelListener(TableModelListener tml) { if (! tableModelListenerList.contains(tml)) { tableModelListenerList.add(tml); } } public void removeTableModelListener(TableModelListener tml) { tableModelListenerList.remove(tml); } } 

PS:这个示例部分来自其他一些实现,我刚刚将其更新到您的场景,如上所述。 所以它很可能包含一些代码闪烁。 它只是为了让您了解解决方案的外观。

您的DataStorage就像示例代码中使用的StudentRegistration一样。

  // TIP: It can be handy to place the student in some order in the Map // (therefore using the sorted map). private SortedMap students = new TreeMap(); 
  // QUESTION: Why not use argument name 'student'? public void addStudentMember(Student aAcc) { students.put(aAcc.getUser(),aAcc); } // Updated implementation public void addStudent(Student student) { students.put(student.getAccID(), student); } 
  // QUESTION: Would a method name 'getNumberOfStudents' not be better? public int getStudentRows() 

对我来说,有一点不清楚为什么StudentAccount延伸。 帐户识别,是一个独特的id,通过孔系统? 员工(用户)和学生(用户)都将其作为唯一标识吗? 在哪里/谁创造它们? 如果不是系统自身,则永远不能保证它们也正确地进入您的系统。 即使在检查系统中的唯一性时,也会有所帮助。 但谁说不是别人(由加入者)使用别人他/她的独特身份? (如何创建学生和工作人员(帐户)?如果这些ID确实是唯一的,为什么不使用那些将学生放入SortedMap?如果排序不重要。为什么不使用学生列表?

name参数是否唯一(通过它将学生放在Map中)?

编程不仅仅是学习编程语言。 一旦理解了OO语言Java,就可以阅读一些更通用的编程书籍。 在您的具体情况下,我会说从域驱动设计开始。 然后继续阅读这些测试驱动开发 , 重构模式和设计模式等书籍。