tags:

views:

144

answers:

4

Hello! I am new at using Jtable and I need some help. I want to write the following CODE to display data from queue in the table

a problem : the data does not appear in the table

i dont kow what is a problem !!

i need help , please

Source Code :

// class student

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

// class node

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

}

// class queue

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

}

// class program

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();
}
}
+1  A: 

You're class queue should implement TableModel. Then create your table with:

Queue q= new Queue();
JTable table= new JTable(q);
Pierre
it's not to hard to do, just remember to call the fire* methods, and it works like *magic*
Carlos Heuberger
+3  A: 

Two things:

  1. Please use an uppercase letter to start your class names

  2. A custom TableModel is probably a good idea. Instead of implementing TableModel from scratch, extend AbstractTableModel instead, since it handles all the events and listener aspects and will save you a lot of time.

Jason Nichols
A: 

thanx i understanded your idea i tried do this .. but i can't !! please , if you have time , do this for me .. help me please

wasim
A: 

I found at least one error, not sure if the only one:

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

this.info = info; is doing nothing at all, try this:

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

Some unit tests would be great to catch this... or just use the collections from Java...

EDIT:
second, in 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();

you are not doing a real copy of x here:
- x.length is still zero
- you are still using the original nodes, not a copy. If you do x.dequeue() the original nodes get changed
- x.dequeue changes x.length so your loop will stop halfway

Better just navigate the queue:

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:
That way the table only will be updated when pressing the button...
Use a TableModel, as sugested in the other answers to have it updated every time the queue gets changed.
I also don't like the ideia of creating a new JTable and JScrollPane every time to update the data... I prefer to create the GUI with one instance of the JTable and just update that instance's model when needed. (The TableModel would do that for you).

Carlos Heuberger
oooh,It seems that I was working without a focus
wasim
I tried not to change to much of the code/logic...
Carlos Heuberger
Thank you dear .. I am very grateful to you ..I also don't like the idea of creating a new JTable and JScrollPane every time to update the data ... i do this becouse i dont know how can add new row .. when add new student !!
wasim
use the DefaultTableModel or an own TableModel (bit hard at start, better in long time run) Have a look (or 2) at the JTable tutorial: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
Carlos Heuberger
no way...What happens to me, Appeared a new problem .. It adds blank cells !! I'm in a real crisis if not done this work before tomorrow
wasim