Java: GUI приложение для работы с текстовыми файлами
Привет, читатель :)
Дали вот такое задание, для написание на Java и обязательно в среде NetBeans:
Написать программу, которая должна уметь:
- Открывать каталог, типа С:\users\
- Выводить из каталога в Combobox файлы
- По нажатию кнопки «открыть» открывать в редактор текстовый файл из каталога
- При изменении файла и нажатии на кнопку «сохранить» сохранять изменения в том же файле который был открыт
Можно сказать, что я начал и закончил интерфейсом. А ну и еще одно — эта инструкция не будет такой подробной как некотрые ранее, так как мне кажется что тут все примитивно.
Кнока Open Dir открывает стандартный диалог открытия файла. В моем случае папок. Единственный combobox содержит название файлов в папке (только в текущей — без поддиректорий). Open for Edit открывает файл и считывает текст в TextArea, ну а save записывает обратно в файл.
Код и обработчики.
Я не очень хорошо знаю, как пишуются java-приложения в окнах (это первое было), поэтому я сразу искал примеры и делал по ним, вытаскивая подходящие кусочки кода.
Обработчик для кнопки «Open Dir» такой:
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int ret = fileChooser.showDialog(this, "Open Dir");
if (ret == JFileChooser.APPROVE_OPTION)
{
jComboBox1.removeAllItems();
String patch = fileChooser.getSelectedFile().getAbsolutePath();
dir_patch = patch;
jLabel2.setText("Current Directory is " + patch);
final File folder = new File(patch);
for (final File fileEntry : folder.listFiles())
{
if (!fileEntry.isDirectory())
{
jComboBox1.addItem(fileEntry.getName());
}
}
}
Мне нужен был диалог открытия папки, но java предоставляет единый (как я понял позднее) для файлов и папок. Настраивается режимами. Спасибо ребятам со stackoverflow.com. Далее нужно получить путь до выбраной папки. Снова stackoverflow помог. Далее нужно было забить имена файлов в Combobox. Как это сделать написано здесь, но тут написан целый метод, для рекурсивного обхода папок — упрощаем. Отлично, теперь у меня открывается директория и те файлы, которые там есть прописываются в комбобокс.
Дальше нужно научить открывать ТЕКСТОВЫЕ файлы. ОК, нужен способ получить расширение файла. Ответ снова тут. Я взал способ по-сложнее, вдруг кто захочет запустить программку на *nix системе? В итоге получился вот такой вот метод:
private boolean isItTextFile(String FileName)
{
String extention = "";
int i = FileName.lastIndexOf('.');
int p = Math.max(FileName.lastIndexOf('/'), FileName.lastIndexOf('\\'));
if (i > p)
extention = FileName.substring(i+1);
return ("txt".equals(extention));
}
Теперь открытие файла: (как его открывать и считывать в TextArea здесь, ну и записывать обратно там же)
try {
String filename = jComboBox1.getSelectedItem().toString();
if (!isItTextFile(filename))
{
JOptionPane.showMessageDialog(rootPane,"You try to open non-text "
+ "file. It's impossible","Error", JOptionPane.ERROR_MESSAGE);
return;
}
FileReader reader = new FileReader(dir_patch + "\\" + filename);
BufferedReader br = new BufferedReader(reader);
jTextArea1.read( br, null );
br.close();
jTextArea1.requestFocus();
} catch (Exception e)
{
JOptionPane.showMessageDialog(rootPane,"Something does not work...",
"Error",JOptionPane.ERROR_MESSAGE);
}
Запись:
try {
String filename = jComboBox1.getSelectedItem().toString();
if (!isItTextFile(filename))
{
JOptionPane.showMessageDialog(rootPane,
"You try to save non-text file. It's impossible",
"Error", JOptionPane.ERROR_MESSAGE);
return;
}
else if ("".equals(filename))
{
JOptionPane.showMessageDialog(rootPane,"File name is emtry!",
"Error", JOptionPane.ERROR_MESSAGE);
return;
}
FileWriter writer = new FileWriter(dir_patch + "\\" + filename);
BufferedWriter bw = new BufferedWriter( writer );
jTextArea1.write( bw );
bw.close();
jTextArea1.setText("Saved");
jTextArea1.requestFocus();
} catch (Exception e) {
JOptionPane.showMessageDialog(rootPane,"Something does not work...",
"Error",JOptionPane.ERROR_MESSAGE);
}
Про то, как создавать диалоги написано тут.
Получился вот такой проект. файлы:
Спасибо, что дочитали до конца. Как всегда буду рад ответить на любые ваши вопросы.
