如何在JTable中使用hashMap

sut*_*toL 5 java swing

我有一个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)

wil*_*ood 8

您有几种选择.我可能会构建自己的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构建一个.更有男子气概:)


Emi*_*mil 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;
}
}
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*new 3

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

从链接:

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

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

  • TableModel 实际上是适配器类,用于 JTable 和要显示的数据!好处还在于,当您通过 GUI 更改值时,它们可以存储回您的数据模型中!(请参阅我的示例代码,其中 public void setValueAt(Object value, int rowIndex, int columnIndex) 需要一个实现。并且可以通过提供 public boolean isCellEditable(int rowIndex, int columnIndex) 的实现来对每个单元格进行修改! (2认同)