2010-12-17 78 views
3

这是我的全班同学。我从文本文件中读取数据,并将它们放入一个aeeaylist。然后从该阵列列表我要显示在一个JTable,数据时的具体方法是called.But是犯规从位于另一个JFrame类一个JButton显示任何东西JTable不显示任何内容?

/* 
* 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); 

} 

} 

我请showOptionA()。

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

基本上我有不同的选项的“主”的JFrame,和每个按钮,代表不同的选项,从调用公司类适当的选项的方法。

当我点击按钮“显示员工状态”。我希望它显示上面的JTable。相反,一个新的框架打开,但是空白?

编辑:如果我改变showOptionA()静态,然后只是把它里面showEmployeesActionPerformed,(它位于类PayrollForm)

public static void showOptionA(){ 

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

} 

我现在看到的列,但没有数据(空)

回答

2

这与调用revalidate没有任何关系,正如另​​一个人所建议的那样,并且可能与调用错误对象上的方法有关。在您的showEmployeesActionPerformed方法中,您创建一个新的公司对象,一个不可视化的对象。关键是在可视化的GUI上调用这个方法。您可以通过将可视化GUI对象的引用传递给想要调用其方法的类来完成此操作。这可以通过setCompany方法完成:

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

或通过构造函数参数。

+0

所以如果我明白我必须在公司类中创建一个setCompany方法,然后从showEmployeesActionPerformed调用该方法? 还是相反? 我在showEmployeesActionPerformed的方法中创建了类Company的对象,以获得对Company公司方法的访问 – George 2010-12-17 15:36:43

+0

我也尝试过:我将public void showOptionA()转换为public static void main(String args []),以查看它是否会只从公司类内部平稳地运行,但是只有列名出现。表格表现为空? – George 2010-12-17 16:03:53

+0

不,您不需要公司班级中的setCompany。相反,您需要在任何其他外部类中调用公司对象方法的setCompany类。通过这种方式,您可以确保这些其他类正在调用正确显示的公司对象上的方法。 – 2010-12-17 18:36:08

0

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

+0

你为什么推荐这个?只要您激发正确的更改方法以通知表模型的侦听器,就不需要在添加或更改模型后调用重新验证 - 即使使用DefaultTableModel,这也不是必需的。 – 2010-12-17 14:22:41

+0

同意在更新模型后不需要调用revalidate()。但是,代码确实会创建一个新表格和滚动窗格,然后将该滚动窗格添加到框架。所以是的,你需要在向框架添加滚动窗格后重新验证。所以正确的想法,错误的原因,当然假设该方法被执行并且TableModel实际上被重新创建。 – camickr 2010-12-17 16:25:08

1

我想原因是你的方法showOptionA():

首先你把你的JTable和模型你的公司对象,这是你的框架。但紧随其后,您将创建一个新的公司对象,设置所需的框架设置并显示该对象,而不是您的第一个公司对象,即表所在的位置。

你可以离开gui,直接在Company对象上设置DefaultCloseOperation,并将其设置为true。

其他一些建议: 您还应该设置帧的大小,然后将其设置为可见。 而且吸气剂通常只是放弃相关的对象,而不是放在某个列表上。 可能会有更多的错误,但它至少应该显示你的表。

0

好的问题解决!问题出在getOptionA()方法中。 我设置了Jtable的模型,但不是可见的选项。这就是为什么它显得空虚。我通过移动来纠正这个问题

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。通过这样做ShowOptionA变得无用(因此我删除了它)。现在我从showEmployeesActionPerformed调用getOptionA,并且它全部都OK:)。感谢所有回复我的消息的人,并特别感谢气垫船Full Of Eels。他帮我取得了不错的成绩,为什么桌子没有按照我想要的方式出现