2012-02-25 18 views
2

私は既に作成したJTableに(GUIに書き込まれた)データを保存する際に問題があります。問題は、GUIの[追加]ボタンをクリックするとJTableに表示されるのではなく、別のウィンドウが開き、そこに表示されるということです。だからそれは追加されますが、それはテーブルに表示されません。相続人は、別のウィンドウに情報を表示するコードの一部:JTableにarrylistデータを格納

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のイム使用して、デフォルトのテーブルモデルが異なるパッケージにthatsのです。私はこのコードはJTableの中に保管してもらうにはどうすればよい

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

- :私は、データを追加するためのボタンでのMouseListenerを使用し...ここにコードの一部ですか...?

+1

だから、間違ったことを行うコード、つまりボタンのアクションリスナーを表示する必要がありますか? – DNA

+2

JButtonでMouseListenerを使用しないでください。 ActionListenerを使用してください。これが彼らの目的です。 –

+0

最終的なブロック()内のオブジェクトを閉じるために+1 – mKorbel

答えて

4

1)は、時間一旦JTableDefaultTableModelを定義FileまたはDatabaseからデータをロードするためのバックグラウンドタスクを開始File IOまたはDatabase

2)からの背景にローディング値に対してSwingWorker又はRunnable#Threadを使用simple example

+0

yep - 良いアドバイス! –

5

問題は、GUIの追加ボタンをクリックすると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メソッドのパラメータを使用して、この参照を取得することがよくあります。
  • また、JButtonではMouseListenersを使用しないでください。代わりにActionListenersを使用してください。 MouseListenersは、無効になっているにもかかわらず引き続き動作するボタンなど、奇妙な動作を引き起こす可能性があります。
+0

あなたは何度も聞いたように、偉大な心... +1 – mKorbel