как использовать hashMap с JTable

у меня есть hashMap, который я хотел бы, чтобы его данные были просмотрены в JTable, как когда-либо я испытываю затруднения при получении hashMap суммы столбцов и строк, и данные, чтобы быть displayed.i имеют hashmap, который берет считавший в качестве ключа и объекта студентов, в которых каждый у студентов есть свои данные как имя, идентификатор, возраст, etc.however обращающийся к документам JTable, это говорит, что мне был бы нужен ints для строки и столбца и массива мультиразмера текстового объекта. как я могу сделать это? я могу изменить свой hashMap в массив multidimenion?

- Редактирование я отредактировал свой вопрос, таким образом, это могло быть более ясно, я довольно плохо знаком с Java, я действительно не получаю то, что отправили некоторые из Вас, тем более, что работа, которую я делаю, вполне связана с OO и схватыванием, что понятия OO являются моей самой сложной задачей,

/I имейте 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;
    }
}
5
задан sutoL 13 February 2010 в 13:57
поделиться

4 ответа

Если вы говорите, что наиболее популярными запросами являются временные рамки, Я бы рекомендовал идти с одним столбцом, который хранит время, как в вашем первом варианте .

Вы можете выбрать свою собственную эпоху для приложения, и работать оттуда.

Это должно упростить запросы, которые необходимо записать при поиске временных интервалов.

Также посмотрите на 10,3,1. Типы DATETIME, DATE и TIMESTAMP

Однако микросекунды не могут быть сохранены в столбец любых временных данных напечатать. Любая микросекундная часть отказанный. Преобразование TIME или Значения DATETIME в числовую форму (для например, путем добавления + 0) результатов в двойное значение с микросекундной частью из .000000

-121--3165614-
use base qw(Horse Donkey);

Это примерно эквивалентно:

BEGIN {
    require Horse;
    require Donkey;
    push @ISA, qw(Horse Donkey);
}

Более точно, если вам нужно загрузить код модулей, а также наследовать от них. BTW, есть проблемы с множественным наследованием, но это другой вопрос:)

Изменить: Compile-time v-run-time преимущества:

  • Вы имеете безопасность compile-time check с использовать base означает, что ваш сценарий даже не будет запущен, если ваш базовый модуль не присутствует в файловой системе.
  • Если вы хотите использовать данный модуль во время выполнения, вы можете протестировать и добавить модуль к родителям:

    if (eval {request X}) { push @ ISA, 'X'; }

-121--4320932-

Здесь доступно несколько опций . Возможно, я построю свою собственную TaureModel и преобразую 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 и заполнить массив правильными данными.

Это ответ на ваш вопрос, но я бы рекомендовал вам взглянуть на интерфейс TaureModel и построить его вокруг вашей HashMap студентов. Более мужественно:)

8
ответ дан 18 December 2019 в 07:29
поделиться

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

По ссылке:

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

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

3
ответ дан 18 December 2019 в 07:29
поделиться

Это можно сделать с помощью реализация интерфейса 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 напрямую не задан, но экземпляр 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<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: Этот пример частично взят из другой реализации, я просто обновил его для вашего сценария, как описано выше. Так что вполне возможно, что в нем есть какие-то блески кода. Он предназначен только для того, чтобы дать вам представление о том, как может выглядеть решение.

2
ответ дан 18 December 2019 в 07:29
поделиться

Скомпилированную библиотеку VB6 можно использовать в программе C # с помощью COM Interop.

https://stackoverflow.com/questions/tagged/interop

-121--2475331-

Я думаю, что вы должны просто иметь возможность добавить библиотеку, которая содержит ваш тип VB6 в качестве ссылки в ваш проект C #. Visual Studio создаст сборку взаимодействия на лету, и вы получите доступ ко всем типам в библиотеке VB6 через Runtime Callable Wrappers .

Инструмент, который создает Interop Assembly является TLBIMP.EXE , и вы можете запустить его самостоятельно, если хотите больше контроля над процессом, например. если требуется создать основную сборку взаимодействия , которая может совместно использоваться несколькими управляемыми компонентами.

-121--2475330-

Ваше хранилище данных похоже на 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 . Идентификация счета, это уникальный идентификатор, через систему дыр? Все ли сотрудники (пользователи) и студенты (пользователи) имеют такую уникальную идентификацию? Где/кто их создает? Если не система сама, это никогда не может быть guranteed, что они также правильно войти в вашу систему. Даже при проверке уникальности системы помогает. Но кто сказал, что не кто-то другой (по акценту) использовал кого-то еще свой уникальный идентификатор? (Как создаются студенты и сотрудники (аккаунты)? Если эти идентификаторы действительно уникальны, почему бы не использовать их для размещения ученика в SortedMap? Если сортировка не важна. Почему бы просто не использовать список студентов?

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

Программирование - это не более чем изучение языка программирования. Как только вы поймете язык OO Java, хорошо прочитать несколько более общих книг по программированию. В вашем конкретном случае я бы сказал, начните с Domain Driven Design . Затем продолжите работу с такими книгами, как Test Driven Development , Refactoring to Patterns и Design Patterns .

0
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: