Adding a frame/textarea to an application
So, I figured out how to get my folder monitoring code working, but now I would like to make it output into a window, rather than the console. I have both codes working separately but don't know how to merge them together into a single class. I realize that this is beginner stuff, but that's what I am :)
This is the working folder monitor code:
Code :
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyListener;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FileWatcher {
public void sample() throws Exception {
String path = "D:\\download";
System.out.println(path);
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
boolean watchSubtree = true;
int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
Thread.sleep(1000000);
boolean res = JNotify.removeWatch(watchID);
if (!res) {
System.out.println("Invalid");
}
}
public void TouchFile(String fName) {
if ((fName.indexOf("Thumbs") == -1) || (fName.indexOf(".rar") == -1)){
String TodayDate = "";
String fModifyDate = "";
String line;
String line2 = "error";
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
File filename = new File(fName);
try {
} catch (Exception e) {
e.printStackTrace();
}
TodayDate = dateFormat.format(calendar.getTime());
fModifyDate = dateFormat.format(filename.lastModified());
try {
Thread.currentThread().sleep(1000);
while ((line2.indexOf("error") != -1) && (!fModifyDate.equals(TodayDate))){
System.out.println(fName + " modified on: " + fModifyDate);
line2 = " ";
Process p = Runtime.getRuntime().exec("touch.exe " + "\"" + fName + "\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
line2 = line2 + "\n" + line;
}
input.close();
System.out.println(line2);
p.waitFor();
}
}
catch (Exception err) {
err.printStackTrace();
}
}
}
class Listener implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName,
String newName) {
print("renamed " + rootPath + " : " + oldName + " -> " + newName);
}
public void fileModified(int wd, String rootPath, String name) {
//print("modified " + rootPath + " : " + name);
TouchFile(rootPath + "\\" + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
print("deleted " + rootPath + " : " + name);
}
public void fileCreated(int wd, String rootPath, String name) {
print("created " + rootPath + " : " + name);
TouchFile(rootPath + "\\" + name);
}
void print(String msg) {
System.err.println(msg);
}
}
public static void main(String[] args) {
try {
new FileWatcher().sample();
} catch (Exception e) {
e.printStackTrace();
}
}
}
This is is the working text area/window making code:
Code :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JPanel implements ActionListener {
protected JTextField textField;
protected JTextArea textArea;
private final static String newline = "\n";
public Test() {
super(new GridBagLayout());
textField = new JTextField(20);
textField.addActionListener(this);
textArea = new JTextArea(5, 20);
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
//Add Components to this panel.
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
add(textField, c);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
add(scrollPane, c);
}
public void actionPerformed(ActionEvent evt) {
String text = textField.getText();
textArea.append(text + newline);
textField.selectAll();
//Make sure the new text is visible, even if there
//was a selection in the text area.
textArea.setCaretPosition(textArea.getDocument().getLength());
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add contents to the window.
frame.add(new Test());
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Re: Adding a frame/textarea to an application
Quote:
but don't know how to merge them together into a single class
I'd recommend not merging them into a single class...(somewhat defeats the purpose of object oriented programming and reusable code). Rather, adapt FileWatcher so it can function independently of the other class as well as System.out. One way would be to modify FileWatcher to write to a PrintWriter (which System.out is an instance of) - this allows you to pass ANY PrintWriter to the class. Then should you want to get the information rather than print it the System.out, you can create a PrintWriter using a StringWriter
Code :
StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
FileWatcher watcher = new FileWatcher(writer);//to write to the StringWriter.
Now, every time the FileWatcher class does something it writes to StringWriter, whose value can be retrieved like this
Code :
String value = sw.getBuffer().toString();
If you want dynamic updating, you will have to adapt this method to notify when the StringWriter has been written to (if I haven't completely lost by now you and the above helps you out, we can deal with that issue should it come up)
Re: Adding a frame/textarea to an application
Hi copeg, thanks for your reply! I couldn't quite figure out how to use the code that you gave me but it did point me in a good direction and I got it the window logging to work in the end, after a lot of googling and trying things out.
The code works now as I want it but I'd really appreciate it if someone could take a look and tell me if there are any glaring coding mistakes/bad practices in there. I'm pretty sure there are, as I suspect the way I use variables isn't the best, but there are probably others too.
Code :
import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyListener;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JTextArea;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.SwingWorker;
import javax.swing.JScrollPane;
import java.util.logging.*;
import java.awt.BorderLayout;
public class FileWatcher extends JPanel {
private static String line2 = "error";
private JFrame frame = new JFrame();
private JTextArea textArea = new JTextArea();
private JScrollPane pane = new JScrollPane(textArea);
private static FileWatcher watcher = new FileWatcher();
private void sample(String path) throws Exception {
showInfo("Monitoring: " + path);
int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
boolean watchSubtree = true;
int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
Thread.sleep(1000000);
boolean res = JNotify.removeWatch(watchID);
if (!res) {
//System.out.println("Invalid");
showInfo("Invalid");
}
}
public void TouchFile(String fName) {
if ((fName.indexOf("Thumbs") == -1) && (fName.indexOf(".rar") == -1) && (fName.indexOf(".part") == -1)){
String TodayDate = "";
String fModifyDate = "";
String line;
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
File filename = new File(fName);
try {
} catch (Exception e) {
e.printStackTrace();
}
TodayDate = dateFormat.format(calendar.getTime());
fModifyDate = dateFormat.format(filename.lastModified());
try {
Thread.currentThread().sleep(1000);
while ((line2.indexOf("error") != -1) && (!fModifyDate.equals(TodayDate))){
//System.out.println(fName + " modified on: " + fModifyDate);
showInfo(fName + " modified on: " + fModifyDate);
line2 = " ";
Process p = Runtime.getRuntime().exec("touch.exe " + "\"" + fName + "\"");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
line2 = line2 + "\n" + line;
}
input.close();
showInfo(line2);
p.waitFor();
}
}
catch (Exception err) {
err.printStackTrace();
}
}
}
public void showInfo(String data) {
watcher.textArea.append(data+"\n");
watcher.frame.getContentPane().validate();
watcher.textArea.setCaretPosition(watcher.textArea.getText().length() - 1);
}
class Listener implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName,String newName) {
//print("renamed " + rootPath + " : " + oldName + " -> " + newName);
showInfo("renamed " + rootPath + "\\" + oldName + " -> " + newName);
}
public void fileModified(int wd, String rootPath, String name) {
//print("modified " + rootPath + " : " + name);
TouchFile(rootPath + "\\" + name);
showInfo("modified " + rootPath + "\\" + name);
}
public void fileDeleted(int wd, String rootPath, String name) {
//print("deleted " + rootPath + " : " + name);
showInfo("deleted " + rootPath + "\\" + name);
}
public void fileCreated(int wd, String rootPath, String name) {
//print("created " + rootPath + " : " + name);
TouchFile(rootPath + "\\" + name);
showInfo(rootPath + "\\" + name);
}
void print(String msg) {
//System.err.println(msg);
showInfo(msg);
}
}
public static void main(String[] args) {
String path = "H:\\download";
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
watcher.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
watcher.frame.setSize(500,200);
watcher.frame.setVisible(true);
watcher.frame.getContentPane().add(watcher.pane);
watcher.frame.setVisible(true);
watcher.frame.setLocation(screenSize.width-500,screenSize.height-250);
try {
if (args.length > 0){
new FileWatcher().sample(args[0]);
}
else {
new FileWatcher().sample(path);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}