Как спроектировать структуру классов текстового редактора? Добрый день. Только начал изучать программирование и написал маленький редактор на 600 строк. Захотел переписать в ООП стиле и получил кучу ... которая не работает. В IDE я создал класс Environment в котором инициализируются основные компоненты (Фрейм, текстовая область, вызывается класс меню и класс сервис (строка состояния процессов("файл открыт", "файл закрыт" и т.д.))). Существует еще один класс - Document (хранит название файла, количество его символов и т.д.(потом буду отсылать это в класс Sevice). Мои проблемы: я не могу нормально открыть из класса меню файл и создать документ открыв файл (был момент когда создавался еще один редактор, но текстовая область все равно оставалась пустой). Но даже, если у меня получается создать документ и передать в него контент, я не могу передать этот же текст в Environment. Класс сервис - это метка внизу редактора которая должна постоянно обновлять свое содержимое (источник события документ и сама среда).Вопросы 1. У кого нибудь есть схема проектирования такого приложения или кто может подсказать основные этапы реализации? 2. Скачал книги: Совершенный код и книга "Банды четырех". Они помогут на этом этапе? Третий день вожусь с этой задачей. В Google был.Update: 1. Как я понял мне нужно изучить UML 2. Далее книги по архитектуре программного обеспечения ---- Только после этого я должен уже уметь проектировать приложение - верно? Неработающая куча ниже:КЛАСС ЗАПУСКАimport javax.swing.*; public class RunTextEditor { public static void main(String args[]) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Environment(); } }); } }КЛАСС СРЕДЫimport javax.swing.*; import java.awt.*; public class Environment { public static JTextArea textArea; private JFrame frame; private MainMenu mainMenu; private Container container; private JScrollPane jScrollPane; private Service statusMessage; Environment() { frame = new JFrame("Text Editor"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new FlowLayout()); frame.setSize(270, 420); textArea = new JTextArea(); jScrollPane = new JScrollPane(textArea); jScrollPane.setPreferredSize(new Dimension(250, 200)); jScrollPane.getViewport().add(textArea); mainMenu = new MainMenu(); frame.setJMenuBar(mainMenu.getMenuBar()); container = frame.getContentPane(); container.add(jScrollPane); statusMessage = new Service(); container.add(statusMessage.getStatusMessage()); frame.setVisible(true); } public static JTextArea getTextArea() { return textArea; } }КЛАСС ДОКУМЕНТpublic class Document { private String fileName; private String content; private int caretPosition; Document(String fn, int cp, String ct) { fileName = fn; caretPosition = cp; content = ct; } public void setCaretPosition(int x) { caretPosition = x; } }КЛАСС МЕНЮБАРimport javax.swing.*; public class MainMenu { private JMenuBar menuBar; private FileMenu fileMenu; MainMenu() { menuBar = new JMenuBar(); fileMenu = new FileMenu(); menuBar.add(fileMenu.getFileMenu()); } public JMenuBar getMenuBar() { return menuBar; } }КЛАСС МЕНЮ-ФАЙЛimport javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class FileMenu { private JMenu menuFile; private JMenuItem loadFile; private JMenuItem saveFile; private JFileChooser fileChooser; private Service service; FileMenu() { menuFile = new JMenu("File"); loadFile = new JMenuItem("Load"); loadFile.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String fileName = ""; fileChooser = new JFileChooser(); service = new Service(); int result = fileChooser.showOpenDialog(null); if (result == JFileChooser.APPROVE_OPTION){ fileName = fileChooser.getSelectedFile().getName(); } else { service = new Service("No file selected."); } LoadFile loadFile = new LoadFile(fileName); Environment.textArea.setText(loadFile.getContent()); } }); saveFile = new JMenuItem("Save"); menuFile.add(loadFile); menuFile.add(saveFile); } public JMenu getFileMenu() { return menuFile; } }КЛАСС ЗАГРУЗКИ ФАЙЛАimport javax.swing.*; import java.io.FileReader; import java.io.IOException; public class LoadFile{ private String fileName; private static JTextArea textArea; LoadFile(String name) { FileReader fw; fileName = name; Service statusMsg; Document document; textArea = new JTextArea(); if(name.length() == 0) { statusMsg = new Service("No filename present"); return; } try{ fw = new FileReader(fileName); textArea.read(fw, null); document = new Document(fileName, 0, textArea.getText()); fw.close(); }catch (IOException exc){ statusMsg = new Service("Error opening or reading file."); return; } } public static String getContent() { return textArea.getText(); } }КЛАСС СЕРВИСimport javax.swing.*; import java.awt.*; public class Service { private JLabel statusMessage; Service() { statusMessage = new JLabel("Test"); statusMessage.setPreferredSize(new Dimension(200, 30)); statusMessage.setHorizontalAlignment(SwingConstants.CENTER); } Service(String message) { statusMessage = new JLabel(message); statusMessage.setPreferredSize(new Dimension(200, 30)); statusMessage.setHorizontalAlignment(SwingConstants.CENTER); } public JLabel getStatusMessage() { return statusMessage; } }
Понимаю вашу ситуацию, и могу предложить вам несколько рекомендаций по проектированию структуры классов для текстового редактора.
Разделяйте ответственности: каждый класс должен быть ответственен за конкретную функциональность. Например, у вас есть класс MainMenu, который отвечает за создание меню, и класс FileMenu, который отвечает за работу с файлами. Разбейте их на более мелкие классы, такие как FileLoader, FileSaver и т.д.
Используйте паттерн наблюдатель (Observer pattern): чтобы обновлять статус процессов в Service при изменении документа или других компонентов. То есть, класс Environment (или другая управляющая структура) должен быть наблюдателем за изменениями в документе.
Передавайте объекты между классами, а не статические переменные: вместо использования статического JTextArea в классе Environment, передавайте экземпляр JTextArea или Document между классами через конструктор или методы.
Освойте паттерны проектирования: книга "Банды четырех" (Gang of Four) содержит множество полезных паттернов, которые могут помочь вам в проектировании приложений.
Изучайте UML диаграммы: UML поможет вам визуализировать структуру классов, их отношения и взаимодействия.
Практикуйте итеративное развитие: начните с минимальной рабочей версии, затем постепенно добавляйте новую функциональность и улучшайте структуру классов.
Надеюсь, эти рекомендации помогут вам в проектировании структуры классов для текстового редактора. Удачи в изучении программирования!
Понимаю вашу ситуацию, и могу предложить вам несколько рекомендаций по проектированию структуры классов для текстового редактора.
Разделяйте ответственности: каждый класс должен быть ответственен за конкретную функциональность. Например, у вас есть класс MainMenu, который отвечает за создание меню, и класс FileMenu, который отвечает за работу с файлами. Разбейте их на более мелкие классы, такие как FileLoader, FileSaver и т.д.
Используйте паттерн наблюдатель (Observer pattern): чтобы обновлять статус процессов в Service при изменении документа или других компонентов. То есть, класс Environment (или другая управляющая структура) должен быть наблюдателем за изменениями в документе.
Передавайте объекты между классами, а не статические переменные: вместо использования статического JTextArea в классе Environment, передавайте экземпляр JTextArea или Document между классами через конструктор или методы.
Освойте паттерны проектирования: книга "Банды четырех" (Gang of Four) содержит множество полезных паттернов, которые могут помочь вам в проектировании приложений.
Изучайте UML диаграммы: UML поможет вам визуализировать структуру классов, их отношения и взаимодействия.
Практикуйте итеративное развитие: начните с минимальной рабочей версии, затем постепенно добавляйте новую функциональность и улучшайте структуру классов.
Надеюсь, эти рекомендации помогут вам в проектировании структуры классов для текстового редактора. Удачи в изучении программирования!