В этой статье я покажи примеры о том как мы используем механизм наблюдателя/наблюдаемого, чтобы обнаружить, если файл данных был доработанный или изменен с прошлого раза.
Мы используем один и тот же файл данных и DataFileTableModel, как и предыдущий. Некоторые незначительные изменения необходимы для класса DataFileTable. Этот класс реализует интерфейс наблюдателя (см. update() метод, который будет вызываться, когда наблюдаемый объект отправляет уведомление).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
[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, чтобы проверить каждую секунду, если данный файл изменились. Если время отличается, от последнего, тогда все зарегистрированные наблюдатели уведомляются об этом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[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(); } } } |