简体   繁体   中英

JTable does not show anything?

here is my entire class. I read data from a text file, put them into an aeeaylist. then from that array list i want to show the data on a JTable, when the specific method is called.But is doesnt show anything

   /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author George
 */
import java.awt.*;
import java.util.ArrayList;
//import java.io.FileInputStream;
//import java.io.FileNotFoundException;
//import java.io.EOFException;
//import java.io.IOException;
//import java.io.ObjectInputStream;
/*import java.io.File;
import java.lang.IllegalStateException;
import java.util.NoSuchElementException;
import java.util.Scanner;
import javax.swing.JOptionPane;*/
import java.io.*;
//import java.util.Locale;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;



public class Company extends JFrame  {
   private  ArrayList<Employee> emp=new ArrayList<Employee>();


 //Employee[] list=new Employee[7];



 public void getEmployees(Employee emplo){

     emp.add(emplo);
 }


 /*public void openTxt(){
     try {
         Scanner input=new Scanner(new File("Employees.txt"));
     }
     catch(FileNotFoundException e){
       JOptionPane.showMessageDialog(null, "File Not Found.");
       System.exit(1);
     }
     }*/

 public void doRead() throws Exception{
             //ArrayList<Employee> emp=new ArrayList<Employee>() ;
        //Employee[] emp=new Employee[7];
         //read from file
        File data = new File("src/Employees.txt");
        BufferedReader read = new BufferedReader(new FileReader(data));
        String input;
        int i = 0;
        //int salesmen = 0;
        while ((input = read.readLine()) != null) {
            String [] lineParts = input.split(",");

            /**
             * the following block converts some of the strings inputted to
             * the appropriate vartypes.
             */

            String EmpNo=(lineParts[0]);
            String type=lineParts[10];
            String PostalCode = (lineParts[5]);
            int phone = Integer.parseInt(lineParts[6]);
            short DeptNo = (short) Integer.parseInt(lineParts[8]);
            double Salary;
            short card = (short) Integer.parseInt(lineParts[11]);
            int dtype=0;

            if(type.equals("FULL TIME")){
                dtype=1;
            }
            else if(type.equals("SELLER")){
                dtype=2;
            }
            else
                dtype=3;

            /**
             *  Creates employee instances depending on their type of employment
             *  (fulltime=1, parttime=3, salesman=2)
             */
            switch (dtype) {
                case 1 :
                    //empNo,firstname, lastname, address, city, PostalCode, phone,
                    //email, deptcode,Jobtype,  salary, TimecardId, hoursW

                    Salary = Double.parseDouble(lineParts[10]);
                    emp.add(new FullTimeEmployee(EmpNo,lineParts[1], lineParts[2], lineParts[3],
                            lineParts[4], PostalCode, phone,
                            lineParts[7], DeptNo,type,Salary, card, 0.0));

                    i++;
                    break;
                case 2 :
                    Salary = Double.parseDouble(lineParts[10]);
                    ArrayList<Orders> orders=new ArrayList<Orders>();
                    Salary = Double.parseDouble(lineParts[10]);
                    emp.add(new Salesman(EmpNo,lineParts[1], lineParts[2], lineParts[3],
                            lineParts[4], PostalCode, phone,
                            lineParts[7], DeptNo,type,Salary, card, 0.0, orders));
                    i++;
                    break;
                case 3 :
                    Salary = Double.parseDouble(lineParts[10]);
                    emp.add(new PartTimeEmployee(EmpNo,lineParts[1], lineParts[2], lineParts[3],
                            lineParts[4], PostalCode, phone,
                            lineParts[7], DeptNo,type,Salary, card, 0.0));

                    i++;
                    break;
                default :
                    break;
           }


        }

 }
 public ArrayList<Employee> getArray(){
     return emp;
 }

 //test methodos gia tin proti epilogi-den deixnei tipota omws sto JTable ????
 public /*JTable */ void getOptionA(){
     ArrayList<Employee> list=getArray();
     /*String[] columnNames = {"Code","First Name","Last Name","Address","Cisty","Postal Code","Phone","Email",
                                "Dept Code","Salary","Time Card","Hours"};*/
    /* Object[][] data;
     */
     JTable table = new JTable();
DefaultTableModel model = new DefaultTableModel();
table.setModel(model);
model.setColumnIdentifiers(new String[] {"Code","First Name","Last Name","Address","City","Postal Code","Phone","Email",
                                "Dept Code","Salary","Time Card","Hours"});
     for( Employee current : list){
         model.addRow(new Object[] {current.getCode(),current.getName(),current.getSurname(),
                                    current.getAddress(),current.getCity(),current.getTK(),
                                    current.getPhone(),current.getMail(),current.getDeptCode(),
                                    current.getSalary(),current.getCard(),current.getHours()
         });

     }

     /*JScrollPane scrollPane = new JScrollPane(table);
     table.setFillsViewportHeight(true);*/
     //return table;
     table.setPreferredScrollableViewportSize(new Dimension(500,50));
     table.setFillsViewportHeight(true);
     JScrollPane scrollPane = new JScrollPane(table);
     add(scrollPane);



 }
 public  void showOptionA(){
     getOptionA();
     Company gui =new Company();
     gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     gui.setVisible(true);
     gui.setSize(600, 400);

 }

 }

I call showOptionA() from a JButton located on another JFrame Class.

private void showEmployeesActionPerformed(java.awt.event.ActionEvent evt) {                                              
    Results showEmp=new Results();
    //showEmp.setVisible(true);
    //showEmp.setOptions(1);
    Company company=new Company();
    /*JTable table=company.getOptionA();
    JScrollPane scrollPane = new JScrollPane(table);
 table.setFillsViewportHeight(true);
 scrollPane.setViewportView(table);
 table.setVisible(true);*/
    company.showOptionA();
}  

Basically i have a "main"JFrame with different options, and each button,representing a different option, calls the appropriate option method from Company Class.

When i click on the button "Show Employees Status". i want it to show the JTable above. Instead a new Frame opens but is blank??

EDIT: if i change showOptionA() to static, and then just call it inside showEmployeesActionPerformed , ( which is located in class PayrollForm)

public static void showOptionA(){

     Company gui =new Company();
             gui.getOptionA();
     gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     gui.setVisible(true);
     gui.setSize(600, 400);

 }

i now see the columns but with no data(empty)

This has nothing to do with calling revalidate as recommended by another and likely has all to do with calling a method on the wrong object. In your showEmployeesActionPerformed method you create a new Company object, one that is not visualized. The key is to call this method on the proper reference, on the visualized GUI. You do this by passing a reference to the visualized GUI object into the class that is wanting to call methods on it. This can be done via a setCompany method:

setCompany(Company company) {
  this.company = company);
}

or via a constructor parameter.

I think the reason is your method showOptionA():

first you add your JTable and Model to your Company Object, which is your Frame. But right after it, you create a new Company Object, set the wanted Frame settings and show that object instead of your first Company object, where the table is.

You just could leave the gui thing out, and set DefaultCloseOperation directly on your Company object and set it visible true.

Some other suggestions: You also should set the size of your frame, before you set it visible true. And getters normally just give back the related object, instead of putting it on some list. Might be there are some more mistakes in it, but it should at least show your table.

在向JTable(或其模型)添加任何内容后调用revalidate()。

Ok problem Solved!. The problem was in getOptionA() method. i set the model of the Jtable, but not the option to be visible. SO thats why it appeared empty. I corrected this by moving

try {
     //try to read from text file
     doRead();
     }
     catch(Exception e){
        JOptionPane.showMessageDialog(null, "An Exception has Occured! The application will now close.");
        System.exit(0);
     }

table.revalidate();


    add(scrollPane);
     setVisible(true);
     setSize(600, 400);

up,from showOptionA, up to getOptionA() method. By doing this showOptionA becomes useless(and thus i deleted it). Now i call getOptionA from the showEmployeesActionPerformed and its all ok :). Thanks to all people who replied to my wuestion, and special thanks to Hovercraft Full Of Eels . He helped me undeestand why the table wasnt appearing the way i wanted it to

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM