2012-02-25 4 views
2

У меня возникла проблема при хранении данных (написанных в графическом интерфейсе) в JTable, который я уже создал. Проблема в том, что когда я нажимаю кнопку добавления в графическом интерфейсе, вместо того, чтобы отображать его в JTable, он открывает другое окно и отображает его там. Поэтому он добавляет, но он не отображает его в таблице. Heres часть кода, которые отображают информацию в другом окне:Хранить данные массива в 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?

+1

Так что, может быть, вам нужно показать нам код, который делает не то, что происходит, т. Е. Actionlistener для кнопки? – DNA

+2

Не используйте MouseListener на JButton. Используйте ActionListener - вот для чего они предназначены. –

+0

+1 для закрытия Объекты в блоке finally() – mKorbel

ответ

4

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

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

+0

yep - хороший совет! –

5

Проблема заключается в том, что когда я нажимаю кнопку добавления в графическом интерфейсе, вместо того, чтобы отображать ее в 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, поэтому вы можете добавить к нему пациента.
  • Вы часто получаете эту ссылку, передавая MemberManager в конструктор слушателя или через параметр метода setter.
  • Опять же, не используйте MouseListeners на JButtons, а вместо этого используйте ActionListeners, так как для них они специально созданы. MouseListeners может вызывать странное поведение, включая, но не ограничиваясь, кнопку, которая все еще работает, несмотря на то, что она отключена.
+0

Хммм, как вы слышали много раз, великие умы ... +1 – mKorbel

Смежные вопросы