Чтение файла данных в jtable и как перезагрузить если файл данные изменились.

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

Мы используем один и тот же файл данных и DataFileTableModel, как и предыдущий. Некоторые незначительные изменения необходимы для класса DataFileTable. Этот класс реализует интерфейс наблюдателя (см. update() метод, который будет вызываться, когда наблюдаемый объект отправляет уведомление).

[DataFileTable.java]
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;
 
public class DataFileTable extends JPanel
        implements Observer {
     
    protected JTable table;
    protected DataFileTableModel model;
     
    public DataFileTable(String dataFilePath) {
        DataFileWatchdog  wd;
        Font f;
         
        f = new Font("SanSerif",Font.PLAIN,24);
        setFont(f);
        setLayout(new BorderLayout());
         
        model = new DataFileTableModel(dataFilePath);
         
        table = new JTable();
        table.setModel(model);
        table.createDefaultColumnsFromModel();
         
        JScrollPane scrollpane = new JScrollPane(table);
        add(scrollpane);
         
        // наблюдаем(за иследуемым объектом)
        // мониторинга любых изменений файла
        wd = new DataFileWatchdog(dataFilePath);
        wd.addObserver(this);
    }
     
    public void update(Observable o, Object arg) {
        // обновляем данные, поскольку файл данных изменились
        model.initVectors();
        table.repaint();
    }
     
    public Dimension getPreferredSize(){
        return new Dimension(400, 300);
    }
     
    public static void main(String s[]) {
        JFrame frame = new JFrame("Data File Table");
        DataFileTable panel;
         
        panel = new DataFileTable("customers.dat");
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.setForeground(Color.black);
        frame.setBackground(Color.lightGray);
        frame.getContentPane().add(panel,"Center");
         
        frame.setSize(panel.getPreferredSize());
        frame.setVisible(true);
        frame.addWindowListener(new WindowCloser());
    }
}
 
class WindowCloser extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
        Window win = e.getWindow();
        win.setVisible(false);
        System.exit(0);
    }
}

В DataFileWatchdog, исследуемый объект, является простой пример который мы рассмотрим. Давайте используем Swing Timer, чтобы проверить каждую секунду, если данный файл изменились. Если время отличается, от последнего, тогда все зарегистрированные наблюдатели уведомляются об этом.

[DataFileWatchdog.java]
import javax.swing.Timer;
import java.awt.event.*;
import java.io.*;
import java.util.*;
 
public class DataFileWatchdog extends Observable
        implements ActionListener {
     
    Timer t = new Timer(1000,this); // проверяем каждую секунду
    long lastModified;
    String file;
     
    DataFileWatchdog(String s) {
        file = s;
        File f = new File(file);
        lastModified = f.lastModified(); // первое время шага
        t.start();
    }
     
    public void actionPerformed(ActionEvent e) {
        File f = new File(file);
        long actualLastModified = f.lastModified() ;
        if (lastModified != actualLastModified) {
            // фаил изменился
            lastModified = actualLastModified;
            setChanged();
            notifyObservers();
        }
    }
}
Обновлено: 07.04.2017 — 16:15

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.