Хранить данные массива в JTable - PullRequest
2 голосов
/ 26 февраля 2012

У меня проблема при хранении данных (записанных в GUI) в JTable, который я уже создал. Проблема в том, что, когда я нажимаю кнопку добавления в графическом интерфейсе, вместо того, чтобы отображать ее в JTable, она открывает другое окно и отображает его там. Таким образом, он добавляет, но не отображает его в таблице. Вот часть кода, которая отображает информацию в другом окне:

import java.lang.Object;
import java.io.*;
import java.util.*;

public class MemberManager {
    File custFile;

    private Member m1 = 
        new Member("M0001", "Mark", "Abela", "13/05/90", "121 Kent Street", "21469432", "99456209");
    private Member m2 = 
        new Member("M0002", "John", "Sant", "25/11/84", "55 Golden Road", "21226932", "79513625");

    private ArrayList<Member> memMemb = new ArrayList<Member>();

    public MemberManager(){
        memMemb.add(m1);
        memMemb.add(m2);
}

    public String[][] getMembers(){
        int pos = 0;

        //Creating the table with the players data
        String data [][] = new String[memMemb.size()][8];

        for (Object obj : memMemb){
            Member mem = (Member)(obj);
            data[pos][0] = mem.getID();
            data[pos][1] = mem.getName();
            data[pos][2] = mem.getSurname();
            data[pos][3] = mem.getDob();
            data[pos][4] = mem.getAddress();
            data[pos][5] = mem.getTel();
            data[pos][6] = mem.getMob();

        }
        return data;
    }

    public void addMember(String id, String name, String surname, String dob, String address, String tel, String mob){
        Member tempMem = new Member();

        tempMem.setID(id);
        tempMem.setName(name);
        tempMem.setSurname(surname);
        tempMem.setDob(dob);
        tempMem.setAddress(address);
        tempMem.setTel(tel);
        tempMem.setMob(mob);

            memMemb.add(tempMem);


           FileInputStream fis = null;
           FileOutputStream fos = null;
        try { 
            fos = new FileOutputStream("Member Data");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(memMemb);
            oos.flush();
        }
         catch(IOException e) {
                e.printStackTrace();
        }
       finally {
            try {
        fos.close();
        }
            catch(IOException e) {
                e.printStackTrace();
            }
        }

        try {
        // read back
        fis = new FileInputStream("Member Data");
         ObjectInputStream ois = new ObjectInputStream(fis);
          Object obj = ois.readObject();
            memMemb = (ArrayList<Member>) obj;
        ArrayList<Member> listFromFile = (ArrayList) obj;
           for (Member member: listFromFile) {
            System.out.println(member.toString());
        }      
    }catch (IOException io){
        System.err.println("Cannot access or write to file");    
    }catch (Exception e){
         e.printStackTrace(); 
        }
     finally { 
         try {
              fis.close();
            }   
            catch (IOException e) {
                e.printStackTrace();
            }             
       }
   }      
}

Используемая им JTable - это табличная модель по умолчанию, которая находится в другом пакете. Я использовал mouseListener на кнопке, чтобы добавить данные ... вот часть кода ...: -

    memAddOk.addMouseListener(this);
    memAddExit.addMouseListener(this);
}

public void mouseClicked(MouseEvent e){ 
    if (e.getSource().equals(memAddOk)){
        id = textBox[0].getText();
        name = textBox[1].getText();
        surname = textBox[2].getText();
        dob = textBox[3].getText();
        address = textBox[4].getText();
        tel = textBox[5].getText();
        mob = textBox[6].getText();

        MemberManager tempData = new MemberManager();
        tempData.addMember(id, name, surname, dob, address, tel, mob);
    } else 
    if (e.getSource().equals(memAddExit)) {
        this.dispose();
    }
}

Как мне получить этот код для хранения в JTable?

Ответы [ 2 ]

5 голосов
/ 26 февраля 2012

Проблема в том, что, когда я нажимаю кнопку добавления в графическом интерфейсе, вместо отображения ее в JTable, он открывает другое окно и отображает его там.

Это просто делает то, чтовы говорите ему:

public void mouseClicked(MouseEvent e){ 
    if (e.getSource().equals(memAddOk)){
        id = textBox[0].getText();
        // .... etc..


        // !!!! *** Here you create a new MemberManager object *** !!!!
        MemberManager tempData = new MemberManager();


        tempData.addMember(id, name, surname, dob, address, tel, mob);
    } else 
    //... etc..

Решение:

  • Не создавайте новый объект MemberManager в вашем слушателе.
  • Вместо этого убедитесь, что ваш слушателькласс имеет ссылку на отображаемый в данный момент объект MemberManager, поэтому вы можете добавить к нему Patient.
  • Эту ссылку вы часто получаете, передавая MemberManager в конструктор слушателя или через параметр метода setter.
  • Опять же, не используйте MouseListeners на JButtons, но вместо этого используйте ActionListeners, потому что это то, для чего они специально созданы.MouseListeners может вызывать странное поведение, включая, но не ограничиваясь, кнопку, которая все еще работает, несмотря на то, что она отключена.
4 голосов
/ 26 февраля 2012

1) использовать SwingWorker или Runnable#Thread для загрузки значения на фоне из File IO или Database

2) определить JTable и DefaultTableModel один раз, запустите фоновую задачу для загрузки данных из File или Database, простой пример

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