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

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

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

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

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

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

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

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

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

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир