JTable

2010-02-13 22 views
5

ile hashMap'in nasıl kullanılacağını gösteren bir hashMap'ım var. Verilerinin bir JTable'da görüntülenmesini istediğim hashMap'in hashMap miktarını ve satırları ve görüntülenecek verileri almada ne kadar sorun yaşıyorum. her bir öğrencinin JTable belgelerine başvurduğunda isim, kimlik, yaş, vb. gibi verileri olduğu öğrencilere bir anahtar ve bir nesne olarak bir hesaba sahip olan, satır ve sütun ve çokboyutlu bir dizi için inters ihtiyacım var diyor Nesne türü. nasıl yapabilirim? hashMap'ımı multidimenion dizisine dönüştürebilir miyim?JTable

- Sorularımı daha açıklayabileceğim şekilde düzenledim, Java için oldukça yeni, özellikle yaptığınız iş gerçekten OO ile ilgili olduğu için OO kavramlarını kavramak benim en büyük zorluğumdur, /Bir dataStorage sınıfına sahibim, kayıtlı kullanıcı HashMap'e GetUser olan bir Kullanıcı adı anahtar girişi ile eklenir./

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


} 

/**** Bu Hesap ***/uzanan bir öğrenci sınıfı

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

} 

/**** Bu Hesap üst sınıf ***/

olduğu
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' gösterilmiştir 'uzanan Tam bir örnek [buradan] (http://stackoverflow.com/a/9134371/230513). – trashgod

cevap

3

Neden JTable (bir Object dizi) istediği tarzda bir arabirim uygular ve Öğrenci mevcut haritaya bir köprü sağlayan bir nesne oluşturmak? Bu nedenle, mevcut veri yapınızı açık bir şekilde sizin için çalışabilecek şekilde koruyabilirsiniz ve yalnızca görünümün (JTable) yararına adaptor sağlıyorsunuz. bağlantısından

:

bir adaptör sınıfları orijinal arayüzünü kullanırken normalde tarafından nedeniyle uyumsuz arayüzleri değil , müşterilerine onun arayüzü sağlayarak olabilir buluşmanızı çalışmasına olanak tanır. Bağdaştırıcı, çağrıları ara yüzüne, orijinal arabirimine yapılan çağrılara çevirir ve bunu yapmak için gereken kod genellikle küçüktür . Adaptör, verileri uygun formlarına dönüştürmek için numaralı telefondan sorumludur.

I (HTML veya benzeri yoluyla görüntülemek istediğiniz daha sonraki bir aşamada ne olur) belirli GUI bileşeni ile sığdırmak için çalışan bir veri yapısını değiştirmek ancak bir gereklilik olarak her görünümde uyumdeğil denemek istiyorum çıkageldi.

+0

İyi cevap Brian, ama bu ev ödevi olduğu için belki de çok karmaşık. Başlamak için ona bir kod verin ve yazınızı bir upvote ile pezevenk yapacağım :) – willcodejavaforfood

+0

@willcodejavaforfood - yes. Neler oluyor diye sorduğum soruya daha fazla cevap vermemek için * kendi başına * soruyu yanıtlamadığımı düşündüm. Kodu yazdığınızdan bu yana cevabınızı + 1'ledim ve çoğalttığını anlamadım :-) –

+0

Şerefe dostum. Yanıtlarınızdan bir tane daha bulacağım ve bunun yerine bir yenisini ekleyeceğim :) – willcodejavaforfood

7

Size çeşitli seçenekleriniz var. Muhtemelen kendi TableModel'umu kendim kurarım ve HashMap'u bir Listeye dönüştürürdüm, ancak bu accountID'un Öğrenci'nin bir parçası olmasını gerektiriyordu ve sizin yazınızdan olup olmadığını söyleyemem. Çok boyutlu bir dizi oluşturmak için muhtemelen daha kolay. Bunu yapmak için, HashMap'unuzdaki her nesneyi incelemeniz gerekir ve bunu yapmak için 'döngü' kullanırız.

Önce verileri tutmak için dizi oluşturmak:

Object[][] tableData = new Object[students.keySet().size()][numberOfColumns]; 

masanız vardır sütun sayısı ile numberOfColumns değiştirin.

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

Yani ne burada yapmak biz Öğrenci nesneyi almak öğrencileri HashMap ve bu anahtarla her tuşa incelemek ve doğru verilerle diziyi dolduracaktır bir döngü oluşturmak olduğunu.

Bu, sorunuzu yanıtlamanız içindir, ancak TableModel arabirimine bir göz atmanızı ve Hashmap of Students (Öğrencilerin HashMap'ı) etrafında bir tane oluşturmanızı öneririz. Daha fazla manly :)

+0

merhaba, evet öğrenciler hesaplara erişebilirlerID – sutoL

+0

"AbstractTableModel" ifadesinin sonuna kadar tam bir örnek gösteriliyor [here] (http://stackoverflow.com/a/9134371/230513) – trashgod

2

Bunu yapmanın yolu, öğrenci kaydı için (aka SortedMap) TableModel arayüzünü uygulamaktır. TableModel, Swing JTable öğesinin verilerini nasıl beklediği hakkında tablo modelidir. TableModel arayüzü, bu verileri sağlamanın tam esnekliğini sağlar. Bu uygulama oluşturulduktan sonra

, bir JTable oluşturarak yerinde mi:

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

Ben düz SortedMap<String, Student> doğrudan verilmediğini bekliyoruz, ancak böyle bir SortedMap<String, Student> içeren StudentRegistration bir örneği, .

/** 
* 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); 
    } 

} 

Not: Bu örnek kısmen başka bir uygulamadan geliyor, ben yalnızca yukarıda açıklanan şekilde senaryonuza güncelledim. Yani bazı kod glitzleri içermesi oldukça olasıdır. Bir çözümün nasıl göründüğüne dair bir fikir vermek için sağlanmıştır.

+0

Girişiniz için teşekkürler, ancak en çok anlamadığım tablo modeli arayüzünün parçaları, afedersiniz, ben sadece java'yı başlattım ve OO kavramlarını kavramak çok zor. Daha ayrıntılı bir yazı yayınlayabilirim belki de bana doğru yönde – sutoL

+0

merhaba diyebilirim, ekledim Benim soru, temelde benim GUI bir kayıt formu vardır, bu yüzden kayıt olduğunda DataStorage hashmap öğrencisi içine bilgi koyacağız ve bundan sonra bir personel olurdu Ayrıca öğrencinin giriş bilgilerini görmek ve görmek de. ve veri görüntülemek için bir JTable'ın kullanılabileceğini okudum, ancak nesneler dizisine ihtiyaç duyuyor, ancak bir HashMap kullanıyorum, bu yüzden bilgileri nasıl alacağımı tamamen şaşırdım. – sutoL

+0

'AbstractTableModel' işlevinin genişletilmesi' TableLodelListener' mutator'larının 'EventListenerList' aracılığıyla gerçekleştirilmesini sağlar; tam bir örnek [burada] gösterilmiştir (http://stackoverflow.com/a/9134371/230513). – trashgod

0

DataStorage, StudentRegistration örnek kodunda kullanılır. StudentAccount uzanır neden

// 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() 

Benim için biraz belirsizdir. Hesap tanımlama, delik sistemi üzerinden benzersiz bir kimlik mi? Personel (kullanıcılar) ve öğrenci (kullanıcılar) hepsi bunu benzersiz bir tanımlama olarak mı yapıyor? Nerede/kim oluşturur? Eğer sistem kendiliğinden değilse, sisteminize doğru bir şekilde girmeleri de garanti edilemez. Sisteminizdeki benzersizliği kontrol ederken bile, yardımcı olur. Ama kim (başkaca) tarafından başkasının kendi benzersiz kimliğini kullandığını kim söyler? (Öğrenci ve personel (hesaplar) nasıl oluşturulur? Bu kimlikler gerçekten benzersizse, öğrencileri bir SortedMap'e yerleştirmek için neden kullanmıyorsunuz? Sıralama önemli değilse. Neden bir öğrenci listesi kullanmıyorsunuz?

(eğer Harita öğrenciye yerleştirdiğiniz tarafından) benzersiz ad parametresini mı?

programlama bir programlama dili öğrenmeye daha sonra biraz daha fazladır. As kez biraz daha genel okumak için o iyidir OO-dil Java anlama Kitapları programlama.Özel durumunuzda Domain Driven Design ile başladığımı söyleyebilirim ve daha sonra Test Driven Development, Refactoring to Patterns ve Design Patterns gibi kitaplarla devam edin.

+0

Superclass hesabı, Ad, Yaş, Cinsiyet gibi ortak örnekler içeriyor, hem Öğrenci hem de Çalışanlar tarafından oluşturulan hesapların mirasını alacaktır, bu yüzden bu hesabı oluşturdum ve personelim ve öğrencim var. – sutoL

+0

public StudentTableModel (Öğrenci Kaydı kaydı) { super() ; this.register = register; } DataStorage sınıfımın kurucusuna neden bir çağrıya ihtiyacım olduğunu anlamıyorum. DataStorage sınıf kurucum sıfırdır – sutoL

+0

Mmm, Orada yeni bir StudentRegistration (...) (aka DataStorage) çağrısı yoktur. Sadece bu örneğe bir başvuru gerekir. – Verhagen

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

Bu, Öğrenci ve Personel sınıflarında override the toString yönteme sahip olacak bir map.For senin amaç bir jtable doldurma için örnek bir koddur.

2

Emil'in yanıtından vazgeçmek, ancak eski sürümü desteklemek için (Java 1.3 ile test edilmiştir).

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

}