JTable ничего не показывает? - PullRequest
       10

JTable ничего не показывает?

3 голосов
/ 17 декабря 2010

вот весь мой класс. Я читаю данные из текстового файла, помещаю их в aeeaylist. затем из этого списка массивов я хочу показать данные в 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 () из JButton, расположенного в другом классе JFrame.

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

 }

Теперь я вижу столбцы, но без данных (пусто)

Ответы [ 4 ]

2 голосов
/ 17 декабря 2010

Это не имеет ничего общего с вызовом revalidate, как рекомендовано другим, и, скорее всего, имеет отношение к вызову метода не того объекта.В своем методе showEmployeesActionPerformed вы создаете новый объект Company, который не визуализируется.Ключ заключается в том, чтобы вызывать этот метод по правильной ссылке в визуализированном графическом интерфейсе.Вы делаете это, передавая ссылку на визуализированный объект GUI в класс, который хочет вызвать методы для него.Это можно сделать с помощью метода setCompany:

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

или с помощью параметра конструктора.

1 голос
/ 17 декабря 2010

Я думаю, что причина в вашем методе showOptionA ():

сначала вы добавляете свой JTable и Модель к своему Объекту Компании, который является вашим Кадром. Но сразу после этого вы создаете новый объект компании, устанавливаете требуемые параметры фрейма и показывает этот объект вместо вашего первого объекта компании, где находится таблица.

Вы можете просто не использовать графический интерфейс, установить DefaultCloseOperation непосредственно в объекте Company и установить его видимым true.

Некоторые другие предложения: Вы также должны установить размер вашего кадра, прежде чем вы установите его видимым true. И получатели обычно просто возвращают связанный объект, а не помещают его в какой-то список. Возможно, в нем есть еще несколько ошибок, но он должен хотя бы показать ваш стол.

0 голосов
/ 18 декабря 2010

ОК, проблема решена!Проблема была в методе 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);

вверх, от showOptionA, до метода getOptionA ().Делая это showOptionA становится бесполезным (и, следовательно, я удалил его).Теперь я вызываю getOptionA из showEmployeesActionPerformed и все в порядке :).Спасибо всем, кто откликнулся на мою просьбу, и особую благодарность Hovercraft Full Of Eels.Он помог мне понять, почему стол не выглядел так, как я хотел

0 голосов
/ 17 декабря 2010

Вызовите revalidate () после добавления чего-либо в JTable (или его модель).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...