2009-12-04 3 views
0

Je suis nouveau à l'aide de Jtable et j'ai besoin d'aide. Je veux écrire le code suivant pour afficher les données de file d'attente dans le tableauLes données n'apparaissent pas dans JTable

un problème: les données ne figure pas dans le tableau

je ne kow ce qui est un problème !!

i besoin d'aide, s'il vous plaît

Code Source:

// étudiant classe

public class student { 
    int id,age; 
    String fn,ln; 

    public student(int id,String fn,String ln,int age){ 
     this.age = age; 
     this.id = id; 
     this.fn = fn; 
     this.ln = ln; 
    } 
} 

// nœud classe

public class node { 
    student info; 
    node link; 
    public node(student st,node next){ 
     this.info = info; 
     this.link = link; 
    } 

} 

// file d'attente de classe

import javax.swing.*; 

public class Queue{ 
    node front ,rear; 
    int length; 

    public void enqueue(student x){ 
     node newnode=new node(x,null); 
     if(front==null) 
      front=rear=newnode; 
     else{ 
      rear.link=newnode; 
      rear=newnode; 
     }length++; 
    } 


    public student dequeue(){ 
     student temp=front.info; 
     if(front==null && rear==null){ 
      throw new RuntimeException("empty"); 
     }else{ 

      front=front.link; 
      if(front==null) 
      rear=null; 

      length--; 
     }return temp; 
    } 


    public String[][] getData(){ 
      Queue x= new Queue(); 
      x.front= front; 
      x.rear = rear; 
      String s[][] = new String[x.length][4]; 
     if(x.front==null){ 
     JOptionPane.showMessageDialog(null,"the Queue is empty,you must add new student befor");  
     }else{ 

      student tmp; 
      for(int i=0;i<x.length;i++){ 

       try{ 
       tmp = x.dequeue(); 
       s[i][0] = tmp.id + " "; 
       s[i][1] = tmp.fn; 
       s[i][2] = tmp.ln; 
       s[i][3] = tmp.age + " "; 

       }catch(Exception e){ 
       System.out.println("Exception from getData"); 
       } 
      } 
     } 
     return s; 
    } 

} 

// programme de classe

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class program extends JFrame implements ActionListener{ 

    Container c; 

    JTextField txtID,txtFN,txtLN,txtAge; 
    JLabel lblTitle,lblID,lblFN,lblLN,lblAge; 
    JButton btnAdd,btnUpdate,btnDelet,btnPrint,btnSort,btnRefresh,btnCancel; 
    JTable table; 

    String data[][]; 
    Queue q; 

    public program(){ 
     c = getContentPane(); 
     setTitle(" Student Applicaion "); 
     c.setLayout(null); 
     q = new Queue(); 

     // add lbl 
     lblTitle = new JLabel("ADD NEW STUDENT"); 
     lblTitle.setFont(new Font ("Helvetica", Font.PLAIN, 20)); 
     lblTitle.setBounds(50,20,200,20); 
     c.add(lblTitle); 


     lblID = new JLabel("ID"); 
     lblID.setBounds(50,50,70,20); 
     c.add(lblID); 

     lblFN = new JLabel("First Name"); 
     lblFN.setBounds(50,80,70,20); 
     c.add(lblFN); 

     lblLN = new JLabel("Last Name"); 
     lblLN.setBounds(50,110,70,20); 
     c.add(lblLN); 

     lblAge = new JLabel("Age"); 
     lblAge.setBounds(50,140,70,20); 
     c.add(lblAge); 

     // add txt 
     txtID = new JTextField(); 
     txtID.setBounds(130,50,120,20); 
     c.add(txtID); 

     txtFN = new JTextField(); 
     txtFN.setBounds(130,80,120,20); 
     c.add(txtFN); 

     txtLN = new JTextField(); 
     txtLN.setBounds(130,110,120,20); 
     c.add(txtLN); 

     txtAge = new JTextField(); 
     txtAge.setBounds(130,140,120,20); 
     c.add(txtAge); 

     // add btn 
     btnAdd = new JButton("Add"); 
     btnAdd.setBounds(90,180,70,25); 
     c.add(btnAdd); 

     btnRefresh = new JButton("Refresh"); 
     btnRefresh.setBounds(165,180,80,25); 
     c.add(btnRefresh); 



     btnUpdate = new JButton("Update"); 
     btnUpdate.setBounds(300,50,100,20); 
     c.add(btnUpdate); 

     btnDelet = new JButton("Delet"); 
     btnDelet.setBounds(300,80,100,20); 
     c.add(btnDelet); 

     btnPrint = new JButton("Print"); 
     btnPrint.setBounds(300,110,100,20); 
     c.add(btnPrint); 

     btnSort = new JButton("Sort"); 
     btnSort.setBounds(300,140,100,20); 
     c.add(btnSort); 

     btnCancel= new JButton("Cancel"); 
     btnCancel.setBounds(355,435,80,25); 
     c.add(btnCancel); 

     // add table 
    // print(); 


     btnAdd.addActionListener(this); 
     btnUpdate.addActionListener(this); 
     btnDelet.addActionListener(this); 
     btnPrint.addActionListener(this); 
     btnSort.addActionListener(this); 
     btnRefresh.addActionListener(this); 
     btnCancel.addActionListener(this); 

     setSize(450, 500); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE);  
     setVisible(true); 
    } 

     public void actionPerformed(ActionEvent e){ 
     if(e.getSource() == btnCancel) 
      System.exit(0); 
     else if(e.getSource() == btnRefresh){ 
      txtAge.setText(""); 
      txtFN.setText(""); 
      txtID.setText(""); 
      txtLN.setText(""); 
     } 
     else if(e.getSource() == btnAdd){ 
      if(isThreeDigit(txtID.getText().trim()) == false || isNumber(txtID.getText().trim()) == false) 
       JOptionPane.showMessageDialog(null,"you entered invalid ID"); 
      else if(isCapital(txtFN.getText().trim()) == false) 
       JOptionPane.showMessageDialog(null,"you must begin First name with capital Character"); 
      else if(!isString(txtFN.getText().trim()) || !(isString(txtLN.getText().trim()))) 
       JOptionPane.showMessageDialog(null,"You can't enter number on your name"); 
      else if(checkAge(txtAge.getText().trim()) == false) 
       JOptionPane.showMessageDialog(null,"You must enter real age in numbers format"); 
      else{ 

       student st = new student(Integer.parseInt(txtID.getText().trim()),txtFN.getText(), 
       txtLN.getText(),Integer.parseInt(txtAge.getText().trim())); 
       q.enqueue(st); 


      // print(); 

      } 
     } 
     else if(e.getSource() == btnPrint){ 
      print(); 

     } 

     } 

     public void print(){ 
      String col[] = {"ID","FName","LName","Age"}; 
      data = q.getData(); 
      table = new JTable(data,col); 
     // table.editingStopped(ChangeEvent e) ; 
      JScrollPane scrollPane = new JScrollPane(table); 
      scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
      scrollPane.setBounds(10,230,420,200); 
      c.add(scrollPane); 


     } 
//~~~~~~~~~~~~ Constraints 

    public boolean isThreeDigit(String id){ 
     if(id.length() <= 3) 
      return true; 


     return false; 
    } 
    public boolean checkAge(String age){ 

      if(!isNumber(age) || Integer.parseInt(age) > 90 || Integer.parseInt(age) < 6) 
       return false; 

       return true; 
    } 
     public boolean isNumber(String id){ 

      for(int i=0;i<id.length();i++){ 
      char c=id.charAt(i); 
      if(c>'9'|| c<'0') 
       return false; 
       } 
       return true; 
     } 
    public boolean isString(String id){ 

     for(int i=0;i<id.length();i++){ 
      char c=id.charAt(i); 
      if(c<='9'|| c<='0') 
       return false; 
       } 
       return true; 

    } 

    public boolean isCapital(String FN){ 
     char c=FN.charAt(0); 
     if(c>='A'&& c<='Z') 
     return true; 

     return false; 
    } 


    public static void main (String[] args) { 
     new program(); 
} 
} 
+0

S'il s'agit de devoirs, veuillez le marquer comme tel. –

Répondre

1

vous êtes file d'attente de classe doit mettre en œuvre TableModel. Ensuite, créez votre table avec:

Queue q= new Queue(); 
JTable table= new JTable(q); 
+1

ce n'est pas difficile à faire, rappelez-vous juste d'appeler les méthodes fire *, et cela fonctionne comme * magic * –

3

Deux choses:

  1. S'il vous plaît utiliser une lettre majuscule pour commencer vos noms de classe

  2. Un TableModel personnalisé est probablement une bonne idée. Au lieu d'implémenter TableModel à partir de zéro, étendez plutôt AbstractTableModel, car il gère tous les aspects des événements et de l'écouteur et vous fera gagner beaucoup de temps.

0

je trouve au moins une erreur, pas sûr que le seul:

public class node { 
    student info; 
    node link; 
    public node(student st,node next){ 
     this.info = info; 
     this.link = link; 
    } 
    } 

this.info = info; ne fait rien du tout, essayez ceci:

public class node { 
    student info; 
    node link; 
    public node(student st,node next){ 
     this.info = st; 
     this.link = next; 
    } 
} 

Certains tests unitaires seraient génial pour attraper ceci ... ou simplement utiliser les collections de Java ...

EDIT:
secondes, en getData:

 public String[][] getData(){ 
      Queue x= new Queue(); 
      x.front= front; 
      x.rear = rear; 
      String s[][] = new String[x.length][4]; 
... 
      student tmp; 
      for(int i=0;i<x.length;i++){ 

        try{ 
        tmp = x.dequeue(); 

vous ne faites pas une vraie copie de x ici:
- x.length est encore zéro
- vous utilisez toujours les nœuds d'origine, et non pas une copie.Si vous faites x.dequeue() les nœuds d'origine sont changés
- x.dequeue change x.length de sorte que votre boucle s'arrêtera à mi-chemin

mieux juste naviguer la file d'attente:

public String[][] getData(){ 
    String s[][] = new String[length][4]; 
    if (front == null) { 
     JOptionPane.showMessageDialog(null,"the Queue is empty,you must add new student befor");   
    } else { 
     int i = 0; 
     // node node = front; // that's why class name should be uppercase!! 
     node aNode = front; 
     while (aNode != null) { // for would also do... 
      student tmp = aNode.info; 
      s[i][0] = String.valueOf(tmp.id); // + " "; 
      s[i][1] = tmp.fn; 
      s[i][2] = tmp.ln; 
      s[i][3] = String.valueOf(tmp.age); // + ""; 
      i += 1; 
      aNode = aNode.link; 
     } 
    } 
    return s; 
} 

EDIT2:
De cette façon, la table sera seulement être mis à jour en appuyant sur le bouton ...
Utilisez un TableModel, tel que suggéré dans les autres réponses pour le mettre à jour chaque fois que la file d'attente est modifiée.
Je n'aime pas non plus l'ideia de créer un nouveau JTable et JScrollPane chaque fois pour mettre à jour les données ... Je préfère créer l'interface graphique avec une instance de la JTable et juste mettre à jour le modèle de cette instance si nécessaire. (Le TableModel ferait cela pour vous).

+0

oooh, il semble que je travaillais sans un focus – wasim

+0

J'ai essayé de ne pas changer beaucoup de code/logique. .. –

+0

Merci cher .. Je vous suis très reconnaissant .. Je n'aime pas non plus l'idée de créer un nouveau JTable et JScrollPane à chaque fois pour mettre à jour les données ... Je fais cela parce que je ne sais pas comment ajouter une nouvelle ligne .. quand ajouter un nouvel étudiant !! – wasim