我有一个hashMap,我希望它的数据可以在JTable中查看我怎么会遇到hashMap数量的列和行以及要显示的数据.我有一个hashmap,它以一个accountID作为键和一个学生的对象,其中每个学生都有他们的数据,如姓名,身份,年龄等,无论如何引用JTable文档,它说我需要整数行和列和一个类型为Object的多维数组.我该怎么做?我可以将hashMap更改为multidimenion数组吗?
- 编辑我已经编辑了我的问题所以它可以更清楚,我是相当新的Java我真的没有得到你们发布的内容,特别是因为我正在做的工作与OO有很大关系并且掌握OO概念是我最大的挑战,
/ 我有一个dataStorage类,注册用户使用其用户名的Key输入添加到HashMap,即getUser./
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();
}
}
Run Code Online (Sandbox Code Playgroud)
/****这是一个扩展账号的学生班级***/
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;
}
}
Run Code Online (Sandbox Code Playgroud)
/****这是一个帐户超类***/
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您有几种选择.我可能会构建自己的TableModel并将其转换HashMap为List,但这需要它accountID是Student的一部分,我不知道它是否来自你的帖子.因此创建多维数组可能更容易.要做到这一点,你需要检查你的每个对象,HashMap为此我们将使用'循环'.
首先创建数组来保存数据:
Object[][] tableData = new Object[students.keySet().size()][numberOfColumns];
Run Code Online (Sandbox Code Playgroud)
将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++;
}
Run Code Online (Sandbox Code Playgroud)
所以我们在这里做的是创建一个循环,它将检查学生HashMap中的每个键,并使用该键检索Student对象并使用正确的数据填充数组.
这是为了回答您的问题,但我建议您查看TableModel界面并围绕学生的HashMap构建一个.更有男子气概:)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是从地图填充Jtable的示例代码.为了您的目的,您必须覆盖 Student和Staff类中的toString方法.
为什么不创建一个对象,以 JTable 所需的方式(数组Object)实现接口,并为现有的 Students 地图提供桥梁?因此,您可以保留显然适合您的现有数据结构,并且您只需提供一个适配器即可使视图(JTable)受益。
从链接:
适配器通过在使用原始接口的同时向客户端提供其接口,允许通常由于接口不兼容而无法一起工作的类一起工作。适配器会将对其接口的调用转换为对原始接口的调用,并且执行此操作所需的代码量通常很小。适配器还负责将数据转换为适当的形式。
我会尽量不改变工作数据结构来适应特定的 GUI 组件(如果在稍后阶段您想通过 HTML 或类似的方式显示会发生什么),而是在出现需求时适应每个视图。