2010-02-13 108 views
5

我有一个哈希映射,我希望它的数据在JTable中查看我怎么一直无法获得哈希映射的行和列的数据量显示。我有一个哈希映射它将accountID作为键和学生对象,其中每个学生都有他们的数据,比如姓名,ID,年龄等,但不管引用JTable文档,它都表示我需要将行和列以及多维数组类型的对象。我该怎么做?我可以将我的哈希映射变成多维数组吗?如何使用哈希映射与JTable

- 编辑我编辑了我的问题,以便它可以更清楚,我相当新的Java我真的不知道你们有些人已经发布,尤其是因为我正在做的工作是非常相关的面向对象和掌握面向对象的概念是我最大的挑战,

/我有一个dataStorage类,注册用户添加到他的用户名,它是getUser键输入HashMap。/

import java.util.*; 

public class DataStorage 
{ 
    HashMap<String, Student> students = new HashMap<String, Student>(); 
    HashMap<String, Staff> staffMembers = new HashMap<String, Staff>(); 
    //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(); 
    } 


} 

/****这是扩展客户*** /一个学生类

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; 
    } 
} 
+0

展示'AbstractTableModel'的一个完整示例显示在[这里](http://stackoverflow.com/a/9134371/230513)。 – trashgod 2016-05-01 16:51:43

回答

3

为什么不按照JTable的需求创建一个实现接口的对象(一个Object数组),并为您现有的学生地图提供了桥梁?因此,您可以保留现有的数据结构,这显然对您有用,并且您只是为了视图(JTable)而提供adaptor

从链接:

的适配器允许类工作 在一起,通常不能 因为接口不兼容的,由 提供其接口为客户 同时使用原来的界面。 适配器将呼叫转换为其 接口,以调用原始接口 ,并且执行此操作所需的代码量 通常为 很小。该适配器还负责 用于将数据转换为适当的 表单。

我会尝试改变工作数据结构,以适应特定的GUI组件(如果在后一阶段要通过HTML或类似的显示会发生什么),但适应每个视图的要求过来。

+0

很好的答案Brian,但是因为这是功课,可能它太复杂了。给他一些代码开始,我会用upvote皮条客你的帖子:) – willcodejavaforfood 2010-02-13 12:56:22

+0

@willcodejavaforfood - 是的。我想我并没有回答这个问题*,而是提供了一个更高层次的观点。自您编写代码后,我已经为您的答案+1了,并且我发现没有重复的代码:-) – 2010-02-13 14:19:10

+0

干杯伙伴。我会找到你的另一个答案,并赞同那个代替:) – willcodejavaforfood 2010-02-13 14:37:28

7

你有几种选择给你在这里。我可能会建立我自己的TableModel并将HashMap转换为列表,但这将需要accountID是学生的一部分,我不知道它是否来自您的帖子。所以可能更容易创建一个多维数组。要做到这一点,你需要检查你的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上创建一个接口。更有男子气概:)

+0

你好,是的,学生有权访问accountID – sutoL 2010-02-13 14:39:26

+0

一个扩展'AbstractTableModel'的完整示例显示在[这里](http://stackoverflow.com/a/9134371/230513)。 – trashgod 2016-05-01 16:46:04

2

要做到这一点的方法是通过实现TableModel接口为学生注册(又名SortedMap)。 TableModel是Swing JTable期望其数据的表模型表示。接口提供了该数据的完全灵活性。

一旦实现创建的,创建一个JTable是直上:

// As StudentRegistration class 
new JTable(new StudentTableModel(studentRegistration)); 
// Or as SortedMap<String, Student> 
new JTable(new StudentTableModel(students)); 

在这种情况下我想到的是,普通SortedMap<String, Student>没有直接给出,但StudentRegistration一个实例,其中包含一个SortedMap<String, Student>像。 PS:此示例部分来自其他一些实现,我只是将其更新为您的场景,如上所述。所以它很可能包含一些代码闪烁。它只是提供一个解决方案的外观。

+0

感谢您的输入,但我不明白表格模型接口的一部分,请原谅我,我只是刚开始java和OO的概念很难掌握。我可以张贴一个更详细的帖子,所以也许你可以指向我在正确的方向 – sutoL 2010-02-13 13:48:51

+0

嗨,我已附加一个我的问题的redit,基本上我的GUI有一个注册表单,所以当注册时我会把这些信息放到DataStorage hashmap student中,然后一个工作人员会也可以登录并查看学生的信息。我已经读过一个JTable可以用来显示数据,但是它需要数组对象,但我使用的是一个HashMap,所以我完全停止了如何检索信息。 – sutoL 2010-02-13 13:54:49

+0

扩展'AbstractTableModel'通过'EventListenerList'提供'TableModelListener'变种的实现;一个完整的例子显示[这里](http://stackoverflow.com/a/9134371/230513)。 – trashgod 2016-05-01 16:50:57

0

您的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确实是唯一的,为什么不使用这些ID将学生放入SortedMap? 如果排序不重要,为什么不使用学生列表?

是名称参数唯一的(由你把学生在地图)?

编程更小那么学习一门编程语言。因为一旦理解面向对象的Java语言是好的阅读一些更普遍在您的具体情况下,我会说从Domain Driven Design开始。然后继续使用这些书籍,如Test Driven Development,Refactoring to PatternsDesign Patterns

+0

该帐户超类包含常见的实例,如姓名,年龄,性别,其中学生和工作人员创建的帐户将继承,这就是为什么我创建该帐户,并有工作人员和学生扩展他们 – sutoL 2010-02-13 15:49:00

+0

公共StudentTableModel(学生注册注册){ super() ; this.register = register; } 我不明白,为什么我需要调用我的DataStorage类的构造函数?我的DataStorage类构造函数为null – sutoL 2010-02-13 16:39:50

+0

嗯,没有新的StudentRegistration(...)(又名DataStorage)的调用。只需要对该实例的引用。 – Verhagen 2010-02-13 19:32:31

6
public class HashMapToJtable { 
public static void main(String[] args) { 
    final Map<String,String> st=new TreeMap<String, String>(); 
    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; 
} 
} 

这是从map.For你的目的填充一个JTable一个示例代码,你将不得不在你的学生和教职员工的类override the toString方法。

2

取消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; 
} 

}