Лаб. 6 Java (Вариант 3)
.docx
SimpleNotepad
package lab_3;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//Реализация интерфейса
public class SimpleNotepad implements ActionListener {
private JFrame frame;
private JTextArea textArea;
private JTextPane textPane;
private JCheckBox lineWrapCheckBox;
private JComboBox<String> fontComboBox;
private JLabel cursorLabel;
private JButton copyButton;
private JButton pasteButton;
public SimpleNotepad() {
frame = new JFrame("Simple Notepad"); //Инициализация фрейма
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Завершение при закрытии
frame.setSize(600, 400);
//Создание панели инструментов
JPanel toolbarPanel = new JPanel(); //Пространстводля размещения других элементов
lineWrapCheckBox = new JCheckBox("Перенос строк"); //Создание флажка
lineWrapCheckBox.addActionListener(this); //Добавление слушателя, который будет реагировать на изменения флажка
toolbarPanel.add(lineWrapCheckBox); //Добавление флажка на панель
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); //Получение доступных шрифтов
String[] fontNames = ge.getAvailableFontFamilyNames();
fontComboBox = new JComboBox<>(fontNames); //Добавление шрифтов в комбинированный список
fontComboBox.addActionListener(this); //Установка слушателя, который будет реагировать на выбор шрифта
toolbarPanel.add(fontComboBox);
copyButton = new JButton("Копировать"); //Создание кнопки копировать
copyButton.addActionListener(this);
toolbarPanel.add(copyButton);
pasteButton = new JButton("Вставить"); //Создание кнопки вставить
pasteButton.addActionListener(this);
toolbarPanel.add(pasteButton);
frame.add(toolbarPanel, BorderLayout.NORTH); //Установка панели на северную часть окна
textArea = new JTextArea(); //Создание текстового компонента
textPane = new JTextPane();
//Установка слушателя, который реагирует на изменение расположения курсора
textArea.addCaretListener(new CaretListener() {
//@Override
public void caretUpdate(CaretEvent e) {
try {
updateCursorPosition(false);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
});
//Установка слушателей к текстовой компоненте
textArea.getDocument().addDocumentListener(new DocumentListener() {
//Событие при добавлении текста в документ, реагирует метод, который меняет данные о расположении курсора
//@Override
public void insertUpdate(DocumentEvent e) {
try {
if (isNewLineInserted(e)) {
updateCursorPosition(true);
} else {
updateCursorPosition(false);
}
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
//Событие при удалении текста, также реагирует метод, который меняет данные расположения курсора
//@Override
public void removeUpdate(DocumentEvent e) {
try {
updateCursorPosition(false);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
//Событие при изменении атрибутов текста (напрмер, стиля)
//@Override
public void changedUpdate(DocumentEvent e) {
try {
updateCursorPosition(false);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
});
JScrollPane scrollPane = new JScrollPane(textArea); //Добавление скрола для текстового пространства
frame.add(scrollPane, BorderLayout.CENTER);
/*
//Создание нижней панели статуса
statusLabel = new JLabel("Строка: 1 Колонка: 1");
frame.add(statusLabel, BorderLayout.SOUTH);
*/
//Создание панели с текущим положение курсора в юго-восточную часть
JPanel cursorPanel = new JPanel(new BorderLayout());
cursorLabel = new JLabel("Курсор: 1:1");
cursorPanel.add(cursorLabel, BorderLayout.EAST);
frame.add(cursorPanel, BorderLayout.SOUTH);
/*
//Создание панели с текущим положением курсора
cursorLabel = new JLabel("Курсор: 1:1");
frame.add(cursorLabel, BorderLayout.WEST);
*/
frame.setVisible(true);
}
//Метод для обновления информации о расположении курсора
private void updateCursorPosition(boolean isNewLineInserted) throws BadLocationException {
//int caretPosition = textArea.getCaretPosition();
int caretPosition = textArea.getDocument().getLength();
int lineNumber = textArea.getLineOfOffset(caretPosition) + 1;
int columnNumber;
//Если новая строка, то столбец = 1
if (isNewLineInserted) {
columnNumber = 1;
//lineNumber += 1;
} else { //Иначе столбец вычисляется путём вычитания смещения начала строки из текущнй позиции курсора
int lineStartOffset = textArea.getLineStartOffset(lineNumber - 1);
columnNumber = caretPosition - lineStartOffset + 1;
}
cursorLabel.setText("Курсор: " + lineNumber + ":" + columnNumber);
}
//Метод проверяющий, была ли использована новая строка
private boolean isNewLineInserted(DocumentEvent e) throws BadLocationException {
Document doc = e.getDocument();
int offset = e.getOffset();
int length = e.getLength();
String text = doc.getText(offset, length); //получение текста с указанного месторасположения
return text.contains("\n"); //если новая строка, то тру
}
//Метод обрабатывает события от элементов интерфейса
//@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == lineWrapCheckBox) { //Если флажок переноса строк поднят, то строки переносятся
textArea.setLineWrap(lineWrapCheckBox.isSelected());
} else if (e.getSource() == fontComboBox) { //Если список шрифтов, то к тексту применяется выбранный шрифт
String selectedFontName = (String) fontComboBox.getSelectedItem();
Font font = new Font(selectedFontName, Font.PLAIN, 12);
textArea.setFont(font);
}
/*
else if (e.getSource() == copyButton) {
String selectedText = textArea.getSelectedText();
if (selectedText != null) {
StringSelection selection = new StringSelection(selectedText);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, null);
}
}
*/
else if (e.getSource() == copyButton) { //Если использована кнопка копировать, то копируется текст в юуфер обмена
String selectedText = textArea.getSelectedText();
if (selectedText == null) {
selectedText = textArea.getText(); //Получить весь текст из текстовой области
}
StringSelection selection = new StringSelection(selectedText);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, null);
}
else if (e.getSource() == pasteButton) { //Если использована кнопка вставить, то текст из буфера обмена вставляется в текстовый компонент
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable contents = clipboard.getContents(null);
if (contents != null && contents.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
String text = (String) contents.getTransferData(DataFlavor.stringFlavor);
textArea.replaceSelection(text);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
Main
public static void main(String[] args) {
new SimpleNotepad();
/*
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new SimpleNotepad();
}
});
*/
}