Java: GUI приложение для работы с текстовыми файлами

Привет, читатель :)

Дали вот такое задание, для написание на Java и обязательно в среде NetBeans:

Написать программу, которая должна уметь:

  1. Открывать каталог, типа С:\users\
  2. Выводить из каталога в Combobox файлы
  3. По нажатию кнопки «открыть» открывать в редактор текстовый файл из каталога
  4. При изменении файла и нажатии на кнопку «сохранить» сохранять изменения в том же файле который был открыт

Можно сказать, что я начал и закончил интерфейсом. А ну и еще одно — эта инструкция не будет такой подробной как некотрые ранее, так как мне кажется что тут все примитивно.

Главное окно

Главное окно

Кнока Open Dir открывает стандартный диалог открытия файла. В моем случае папок. Единственный combobox содержит название файлов в папке (только в текущей — без поддиректорий). Open for Edit открывает файл и считывает текст в TextArea, ну а save записывает обратно в файл.

Код и обработчики.

Я не очень хорошо знаю, как пишуются java-приложения в окнах (это первое было), поэтому я сразу искал примеры и делал по ним, вытаскивая подходящие кусочки кода.

Обработчик для кнопки «Open Dir» такой:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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());
                }
            }
        }
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 системе? В итоге получился вот такой вот метод:

1
2
3
4
5
6
7
8
9
    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));
    }
    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 здесь, ну и записывать обратно там же)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 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);
        }

Запись:

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
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);
        }
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);
        }

Про то, как создавать диалоги написано тут.

Получился вот такой проект. файлы:

Спасибо, что дочитали до конца. Как всегда буду рад ответить на любые ваши вопросы.

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