Динамическое обновление JTextPane при изменении связанного файла - PullRequest
2 голосов
/ 23 августа 2011

Текущий проект, в котором я работаю, создает файл журнала с использованием библиотеки log4j, а также должен иметь функцию «showLog», которая создает фрейм, в котором можно просматривать журнал.Кроме того, этот кадр должен обновляться при изменении файла журнала (добавление нового сообщения журнала).

Ну, я сделал все, кроме действия обновления, и это вопрос, как я могудинамически обновлять?

Здесь фрагменты моего кода, я помещаю только соответствующие строки:

  • Действие интерфейса: запускает действия события public interface Action { public void executer(); }

  • Class CadreTexte: Создает и управляет фреймом, в котором отображается файл журнала public class CadreTexte extends JFrame { private JTextPane log; public CadreTexte(String titre, File texte) { super(titre); if (texte.exists() && texte.canRead()) { this.texte = texte; } else { throw new ExceptionGenerateurs("NE_FILE"); //Own exception } initializeFrame();<br> log= new JTextPane(); log.setEditable(false); java.net.URL urlFichier = null; try { urlFichier = texte.toURI().toURL(); } catch (MalformedURLException e1) { throw new ExceptionGenerateurs("Fichier de texte non montrable"); } try { log.setPage(urlFichier); } catch (IOException e) { System.out.println(e.getLocalizedMessage()); //CATCH } finally { urlFichier = null; } JScrollPane docSP = setScrollPane(); // bars as needed, contains JTextPane getContentPane().setLayout(new BorderLayout()); getContentPane().add(docSP,BorderLayout.CENTER); } }

  • Class Vue: основной фрейм.Он содержит список объектов Action, которые хранятся в HashMap.Действия доступны через меню.Поскольку этот класс очень большой, я ставлю только самые важные строки:

    1. ActionPerformed Function:
      public void actionPerformed(ActionEvent e) { JComponent composant; Action handler; composant = (JComponent) e.getSource(); String idEvenement = composant.getName(); modele.log(Modele.LOG_DEBUG, String.format("Événement. ID: %s",idEvenement)); handler = ACTIONS_MAP.get(idEvenement); if (handler == null) { modele.log(Modele.LOG_ERROR, "Action non identifiée"); } else { handler.executer(); modele.log(Modele.LOG_DEBUG, "Fin action"); } }

    2. ActionvisualiserLog: Action visualiserLog = new Action() { public void executer() { if (cadreLog == null) { cadreLog = new CadreTexte("Fichier du log", model.getLogFile()); visuLog = true; } else { visuLog = !visuLog; } cadreLog.visualiser(visuLog); } };

Наконец, MenuItem, который активирует действие visualiserLog, это JCheckBoxMenuItem

Я надеюсь, что вы можете помочь мне послепонять этот большой вопрос.Если кому-то нужна дополнительная информация, попросите ее!

С уважением!

ПРИМЕЧАНИЕ. Я был бы очень признателен, если бы кто-то смог отредактировать и дать правильный формат вопроса, я боролся средактор и он меня побеждает = (

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

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

Если вы действительно хотите это сделать, я думаю, что единственное решение - сначала прочитать файл и сохранить его длину или дату изменения, а затем запустить поток, которыйкаждые N секунд сравнивает длину или дату модификации с датой, хранящейся в памяти. Если она изменилась, перечитайте файл и обновите текстовую область и длину или дату изменения.

Будьте осторожны, чтобы необновить текстовую область из потока опроса, но из потока отправки события.Используйте SwingUtilities.invokeLater, чтобы сделать это.

0 голосов
/ 23 августа 2011

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

Возможно, вы изобретаете колесо. Apache Chainsaw выглядит так, как будто она может обеспечить требуемую функциональность.

...