2016-09-20 2 views
0

Мне нужна помощь JTable.I'm пытается прочитать данные из файла Contact.txt и заполнить таблицу этими данными.Я могу получить данные из файла правильно с добавлением в Object [] [] 2D-массива без каких-либо проблем. Когда я пытаюсь добавить этот массив объектов в таблицу, ничего не происходит. Извините за мой плохой английский.JTable не показывает Object [] [] data

Файл Contacts.txt включает в себя «Имя», «Последнее имя», «Номер телефона», «Электронная почта».

И этот класс читать текст и добавить его к объекту:

public class ReadFromText { 

public boolean ReadTable(Object [][] data) { 

    boolean status = false; 

    File file = new File("/Users/MacbookPro/Documents/Contacts.txt"); 
    BufferedReader bf = null; 
    FileReader fileReader = null; 
    try { 
     fileReader = new FileReader(file); 
     bf = new BufferedReader(fileReader); 

     String textLine = null; 
     String [] text = null; 

     for (int i = 0; i < data.length; i++) { 
      for (int j = 0; j < 4; j++) { 
       while ((textLine = bf.readLine()) != null) { 
        text = textLine.split(" "); 
        data[i][j] = text[j]; 
        status = true; 
        System.out.println(data[i][j]); 
       } 
      } 
     } 
     bf.close(); 

    } catch (IOException e) { 
     System.err.println(e.getMessage()); 
    } 
    return status; 
} 
} 

Эта часть кода из основного класса:

Object [][]datas = new Object[10][4]; 

ReadFromText r = new ReadFromText(); //new object from ReadData class 
    if(r.ReadTable(datas)== true){ 
     System.out.println("OK");//just for to be sure 
    }else{ 
     System.out.println("NO"); 
    } 
    model = new DefaultTableModel(datas, columNames); 
    table = new JTable(model); 
    table.setFont(new Font("Monospaced", Font.PLAIN, 13)); 
    table.setBackground(new Color(245, 245, 245)); 
    table.setRowHeight(25); 
    table.setMinimumSize(new Dimension(60, 20)); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

Это возвращение "OK", проверьте его от here

Но JTable пуст !!! : посмотрите от this picture

Я надеюсь, что кто-нибудь может мне помочь. СПАСИБО ЗА ВСЕ

+0

Что вы получаете, когда распечатываете данные? – c0der

+0

@ c0der Спасибо за повтор, но я попробовал это. Увидим результат от второго изображения –

ответ

1

Ваш код для чтения данных из файла неправильный. Подумайте об этом на минуту. Вы начинаете внешний цикл со значением 0, тогда у вас есть внутренний цикл со значением 0, а затем вы читаете весь файл, используя цикл while.

Вы хотите, чтобы ваша логика читала одну строку данных, разделила эту строку и добавила, затем добавьте данные в массив. Таким образом, логика должна быть примерно такой:

int row = 0; 

while ((String textLine = bf.readLine()) != null) 
{ 
    String text = textLine.split(" "); 

    for (int i = 0; i < text.length; i++) 
    { 
     data[row][i] = text[i]; 
    } 

    row++ 
} 

Однако вы не должны использовать Массивы для хранения данных. Вы никогда не должны жестко задавать размер структуры данных, поскольку она не позволяет вам добавлять новые данные. Вместо этого вы должны использовать вектор для чтения данных. Тогда не имеет значения, у вас есть 10 строк данных или 100.

Используя этот подход код будет что-то вроде:

Vector data = new Vector(); 

while ((String textLine = bf.readLine()) != null) 
{ 
    String text = textLine.split(" "); 
    Vector row = new Vector(); 

    for (int i = 0; i < text.length; i++) 
    { 
     row.addElement(text[i]); 
    } 
} 

Таким образом, вы должны были бы изменить метод возвращает вектор данных. Вам также нужно будет изменить ваши «columnNames», которые будут добавлены в Vector, чтобы вы могли создать TableModel, используя два вектора.

+0

Большое вам спасибо. Теперь он работает, но он просто заполняет первые столбцы. Теперь я пытаюсь разбить его правильным образом. –

+0

@CoderACJHP, 'Теперь он работает, но он просто заполняет первые столбцы' - индекс столбца в массиве данных никогда не менялся в моем« непроверенном »коде. См. Редактирование для одного способа изменения столбца. Это еще одна причина для использования векторов, так как вам не нужно беспокоиться об индексах. – camickr

1

Я надеюсь, что этот ответ поможет вам найти проблему. Он также призван продемонстрировать важность публикации MCVE, например:

mport java.awt.Color; import java.awt.Dimension; импорт javax.swing.JFrame; import javax.swing.JScrollPane; импорт javax.swing.JTable; import javax.swing.table.DefaultTableModel;

public class TestTable extends JFrame { 

    public TestTable() { 

     super("Main"); 
     setSize(400, 300); 

     Object [][]datas = new Object[][]{ 
      {"A1", "A2","A3","A4"}, 
      {"B1", "B2","B3","B4"} 
     }; 

     Object[] columNames = {"Name","LastName","Phone Num","Email"}; 
     DefaultTableModel model = new DefaultTableModel(datas, columNames); 
     JTable table = new JTable(model); 
     table.setBackground(new Color(245, 245, 245)); 
     table.setRowHeight(25); 
     table.setMinimumSize(new Dimension(60, 20)); 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 

     add(new JScrollPane(table)); 

     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TestTable(); 
    } 
} 

Не только MCVE поможет вам лучше и быстрее реагировать, во многих случаях, как этот, это поможет вам точно определить источник проблемы и решить самостоятельно. Удаление всего, что не является существенным для воспроизведения проблемы, поможет вам (и кто когда-либо пытается помочь) сосредоточиться на том, где проблема. В этом случае вы можете видеть, что устраняя входную часть, вы можете видеть, что JTable отлично работает.
enter image description here

+0

Спасибо за повтор. Моя проблема в заполнении массива 2d при попытке перемещения while ((text = bf.readLine())! =) {} из 2 для циклов. Я получаю результат следующим образом: [Ljava.lang.String; @ 3ede05c0 –

+0

Я знаю, что проблема есть. Вот почему я опубликовал комментарий «Что вы получаете, когда распечатываете данные?» – c0der

+0

Я получаю правильные данные, все в порядке, но таблица все еще пуста. После этого мы решили половину проблемы с г-ном @ camickr :) Теперь только первые столбцы заполняют и должны решить это. Может быть нужно использовать split с другим регулярным выражением ?? Есть ли у вас какие-либо идеи по этому поводу? «просто заполняя первые столбцы» THANX –