Как спроектировать структуру классов текстового редактора? Добрый день.
Только начал изучать программирование и написал маленький редактор на 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;
}
}

21 Авг 2019 в 07:05
231 +1
0
Ответы
1

Понимаю вашу ситуацию, и могу предложить вам несколько рекомендаций по проектированию структуры классов для текстового редактора.

Разделяйте ответственности: каждый класс должен быть ответственен за конкретную функциональность. Например, у вас есть класс MainMenu, который отвечает за создание меню, и класс FileMenu, который отвечает за работу с файлами. Разбейте их на более мелкие классы, такие как FileLoader, FileSaver и т.д.

Используйте паттерн наблюдатель (Observer pattern): чтобы обновлять статус процессов в Service при изменении документа или других компонентов. То есть, класс Environment (или другая управляющая структура) должен быть наблюдателем за изменениями в документе.

Передавайте объекты между классами, а не статические переменные: вместо использования статического JTextArea в классе Environment, передавайте экземпляр JTextArea или Document между классами через конструктор или методы.

Освойте паттерны проектирования: книга "Банды четырех" (Gang of Four) содержит множество полезных паттернов, которые могут помочь вам в проектировании приложений.

Изучайте UML диаграммы: UML поможет вам визуализировать структуру классов, их отношения и взаимодействия.

Практикуйте итеративное развитие: начните с минимальной рабочей версии, затем постепенно добавляйте новую функциональность и улучшайте структуру классов.

Надеюсь, эти рекомендации помогут вам в проектировании структуры классов для текстового редактора. Удачи в изучении программирования!

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 829 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир