как использовать hashMap с JTable - PullRequest
5 голосов
/ 13 февраля 2010

У меня есть hashMap, который я хотел бы, чтобы его данные просматривались в JTable. Однако, когда у меня возникают проблемы с получением количества столбцов и строк в hashMap и отображаемых данных. У меня есть hashmap, который принимает accountID в качестве ключ и объект учеников, в которых каждый ученик имеет свои данные, такие как имя, идентификатор, возраст и т. д. Однако, ссылаясь на документы JTable, он говорит, что мне нужны целочисленные значения для строки и столбца и многомерный массив типа Object. как мне это сделать? я могу изменить свой hashMap в многомерный массив?

- Изменить. Я отредактировал свой вопрос, чтобы он был более понятным, я довольно новичок в Java. Я не совсем понимаю, что опубликовали некоторые из вас, тем более, что работа, которую я делаю, связана с ОО и пониманием. Концепции ОО - моя самая большая проблема,

/ У меня есть класс dataStorage, зарегистрированный пользователь добавляется в 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();
   }


}

/ **** Это ученический класс, который расширяет счет *** /

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

Ответы [ 6 ]

8 голосов
/ 13 февраля 2010

У вас есть несколько вариантов для вас здесь. Я, вероятно, собрал бы свой собственный TableModel и преобразовал бы HashMap в список, но для этого потребовалось бы, чтобы accountID был частью Student, и я не могу сказать, если это из вашего сообщения. Так что, вероятно, проще создать многомерный массив. Для этого вам нужно проверить каждый объект в вашем 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 для студентов. Более мужественный:)

6 голосов
/ 24 августа 2010
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;
}
}

Это пример кода для заполнения Jtable с карты. Для вашей цели вам придется переопределить метод toString в ваших классах Student и Staff.

3 голосов
/ 13 февраля 2010

Почему бы не создать объект, который реализует интерфейс в соответствии с желанием JTable (массив Object) и обеспечивает мост к существующей карте учеников? Таким образом, вы можете сохранить существующую структуру данных, которая, очевидно, работает для вас, и вы просто предоставляете адаптер для удобства просмотра (JTable).

Из ссылки:

Адаптер позволяет классам работать вместе, которые обычно не могли из-за несовместимых интерфейсов, предоставление своего интерфейса клиентам при использовании оригинального интерфейса. Адаптер переводит звонки на его интерфейс в вызовы к оригиналу интерфейс и количество кода необходимо сделать это, как правило, маленький. Адаптер также отвечает для преобразования данных в соответствующие формы.

Я бы попытался , а не , чтобы изменить рабочую структуру данных, чтобы она соответствовала определенному компоненту графического интерфейса пользователя (что произойдет, если на более позднем этапе вы захотите отобразить через HTML или подобное), но адаптироваться к каждому представлению как требование приходит.

2 голосов
/ 03 сентября 2010

Уход от ответа Эмиля, но для поддержки более старой версии (протестировано с 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;
 }

}
2 голосов
/ 13 февраля 2010

Способ сделать это - реализовать интерфейс TableModel для регистра студента (он же SortedMap). TableModel - это табличное представление модели того, как Swing JTable ожидает свои данные. Интерфейс TableModel обеспечивает полную гибкость предоставления этих данных.

Как только эта реализация будет создана, процесс создания 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> как этот.

/**
 * 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<TableModelListener> tableModelListenerList = new ArrayList<TableModelListener>();
    /** 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<String, Student> 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: Этот пример частично взят из какой-то другой реализации, я просто обновил его для вашего сценария, как описано выше. Так что вполне возможно, что он содержит некоторые ошибки кода. Это только для того, чтобы дать вам представление о том, как может выглядеть решение.

0 голосов
/ 13 февраля 2010

Ваш 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()

Для меня немного неясно, почему Student простирается от Account. Идентификация учетной записи, это уникальный идентификатор через дырочную систему? Все ли сотрудники (пользователи) и студенты (пользователи) имеют такую ​​уникальную идентификацию? Где / кто их создает? Если это не системная личность, то нельзя гарантировать, что они также правильно введены в вашу систему. Даже при проверке уникальности в вашей системе, помогает. Но кто сказал, что не кто-то другой (по совпадению) использовал кого-то еще его / ее уникальный идентификатор? (Как создаются студент и персонал (учетные записи)? Если эти идентификаторы действительно уникальны, почему бы не использовать их для помещения ученика в SortedMap? Если сортировка не важна. Почему бы просто не использовать Список студентов?

Является ли параметр имени уникальным (по которому вы помещаете ученика на карту)?

Программирование - это немного больше, чем изучение языка программирования. Как только вы поймете, что такое ОО-язык Java, полезно прочитать несколько более общих книг по программированию. В вашем конкретном случае я бы сказал, начать с Domain Driven Design . А затем продолжайте с такими книгами, как эти Разработка через тестирование , Рефакторинг к шаблонам и Шаблоны проектирования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...