Впервые столкнулся с такой проблемой что когда сохраняю текст и загружаю его заново в JTextPane, центрирование сохраняется в положении в котором первый раз был сохранен текст. То есть если при первом разе я сделал выравнивание по центру и сохранил текст, тогда все подальшие попытки изменить любой фрагмент текста окончатся тем что текст в любом случае сохранится по центру.
Сохраняю текст в БД, выгружаю текст с БД с помощью unescapeJava что-бы сохранить переходы на новую строку
setText(unescapeJava(rs.getString("Text"));
В результате первого сохранение получаю
<html>
<head>
</head>
<body>
<p style="margin-top: 0">
Left
</p>
<p align="center" style="margin-top: 0">
Centr
</p>
<p align="right" style="margin-top: 0">
Right
</p>
</body>
</html>
В результате второго
<html>
<head>
</head>
<body>
<p align="right" style="margin-top: 0">
Left
</p>
<p align="right" style="margin-top: 0">
Center
</p>
<p align="right" style="margin-top: 0">
Right
</p>
<p align="right" style="margin-top: 0">
Лево
</p>
<p align="right" style="margin-top: 0">
Центр
</p>
<p align="right" style="margin-top: 0">
Право
</p>
</body>
</html>
Причем, если изменять только первый три строки где "Left, Center, Right" то все будет работать, если что-то добавить все собьется. В TextPane при редактировании все отображается как нужно, при сохранении сами видите как записывает.
Вот код моего текстового редактора
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import static org.apache.commons.lang3.StringEscapeUtils.unescapeJava;
public class TextEditor extends JFrame {
private JPanel panel = new JPanel(new BorderLayout());
private JTextPane textPane = new JTextPane();
private int id = 0;
private String nameAutor = "";
private String date = "";
public TextEditor(String edit, int id, String date, String nameAutor) {
textPane.setContentType("text/html");
edit = edit.replaceAll("<", "<");
edit = edit.replaceAll(">", ">");
textPane.setText(edit);
this.id = id;
this.date = date;
this.nameAutor = nameAutor;
initComponent();
this.setSize(600, 500);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(true);
this.getContentPane().add(panel);
this.setVisible(true);
}
public void initComponent() {
panel.setBackground(Color.GRAY);
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setBorder(null);
nameAutor = nameAutor + " " + date;
panel.add(new JLabel(nameAutor) {{
setForeground(Color.WHITE);
}}, BorderLayout.PAGE_END);
panel.add(new toolBar(), BorderLayout.PAGE_START);
panel.add(scrollPane, BorderLayout.CENTER);
}
class toolBar extends JToolBar {
public toolBar() {
final String iconCenter = "/icons/AlignCenterHK.png";
final String iconLeft = "/icons/AlignLeftHK.png";
final String iconRight = "/icons/AlignRightHK.png";
final String iconKursiv = "/icons/ItalicHK.png";
final String iconUnder = "/icons/UnderlineHK.png";
final String iconJirniy = "/icons/BoldHK.png";
final String iconFind = "/icons/FindHK.png";
final String iconSave = "/icons/SaveHK.png";
setFloatable(false);
setIgnoreRepaint(true);
add(new JButton() {{
setAction(kursiv());
setText("");
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconKursiv)));
}});
add(new JButton() {{
setAction(jirnyi());
setText("");
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconJirniy)));
}});
add(new JButton() {{
setAction(normal());
setText("");
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconUnder)));
}});
add(new JButton() {{
setAction(left());
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconLeft)));
}});
add(new JButton() {{
setAction(center());
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconCenter)));
}});
add(new JButton() {{
setAction(right());
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconRight)));
//setIcon(new ImageIcon());
}});
add(new JButton() {{
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconFind)));
}});
add(new JButton("img") {{
}});
add(new JButton() {{
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DataBase db = new DataBase();
db.DBConnect();
System.out.println(textPane.getText());
db.setArticle("Text", unescapeJava(textPane.getText()), String.valueOf(id));
}
});
setOpaque(false);
setFocusPainted(false);
setIcon(new ImageIcon(this.getClass().getResource(iconSave)));
}});
}
}
private Action left() {
return new StyledEditorKit.AlignmentAction("", 3);
}
private Action center() {
return new StyledEditorKit.AlignmentAction("", 1);
}
private Action right() {
return new StyledEditorKit.AlignmentAction("", 2);
}
private Action kursiv() {
return new StyledEditorKit.ItalicAction();
}
private Action jirnyi() {
return new StyledEditorKit.BoldAction();
}
private Action normal() {
return new StyledEditorKit.UnderlineAction();
}
}
UPDATE: Упрощенный вариант программы, результат выдает такой же: (1-3 Кнопка(Лево, Центр, Право) 4 кнопка(Сохранить))
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame {
private static String str = "";
public static void main(String[] args) {
TextEditor te = new TextEditor(str);
}
}
class TextEditor extends JFrame {
private JPanel panel = new JPanel(new BorderLayout());
private JTextPane textPane = new JTextPane();
private String text = "";
public TextEditor(String edit) {
this.text = edit;
textPane.setContentType("text/html");
text = edit.replaceAll("<", "<");
text = edit.replaceAll(">", ">");
textPane.setText(text);
initComponent();
this.setSize(600, 500);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(true);
this.getContentPane().add(panel);
this.setVisible(true);
}
public void initComponent() {
panel.setBackground(Color.GRAY);
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setBorder(null);
panel.add(new toolBar(), BorderLayout.PAGE_START);
panel.add(scrollPane, BorderLayout.CENTER);
}
class toolBar extends JToolBar {
public toolBar() {
setFloatable(false);
setIgnoreRepaint(true);
add(new JButton() {{
setAction(left());
setOpaque(false);
setFocusPainted(false);
}});
add(new JButton() {{
setAction(center());
setOpaque(false);
setFocusPainted(false);
}});
add(new JButton() {{
setAction(right());
setOpaque(false);
setFocusPainted(false);
}});
add(new JButton() {{
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
text = textPane.getText();
dispose();
TextEditor te = new TextEditor(text);
}
});
setOpaque(false);
setFocusPainted(false);
}});
}
}
private Action left() {
return new StyledEditorKit.AlignmentAction("", 3);
}
private Action center() {
return new StyledEditorKit.AlignmentAction("", 1);
}
private Action right() {
return new StyledEditorKit.AlignmentAction("", 2);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Из приложения заполняю данные на сервер Firebase, и тут же отображаю их в RecyclerView, по при первом запуске когда происходит запись на сервер в RecyclerView...
Хочу заменить в тегах <img> все атрибуты src на data-src, по всему проекту, но чтобы не затрагивались теги script, js-код и тп
Не знаю как создать ячейки для сапера в html/css/javascriptС помощью div'ов или как? Мне не хватает знаний для этого