Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/46: Рейтинг темы: голосов - 46, средняя оценка - 4.91
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470

JEditorPane: сохранение текста вместе с атрибутами

03.01.2011, 14:10. Показов 9257. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужен простой текстовый редактор с минимальными возможностями задания атрибутов - установка цвета шрифта, размера и т.п.
Никак не могу понять:
1. есть ли простой способ сохранения текста вместе с атрибутами?
2. как эти атрибуты устанавливать в JEditorPane, например, с помощью нажатия отдельной кнопки
3. формат все равно какой - мне нужно все это засунуть в итоге в базу. Сейчас я научился только сделать редактор в JTextPane, выгрузить текст во временный файл с помощь метода write и потом этот файл прочитать и загнать в базу. Возможно ли сделать writer который выводит не в файл, а, например, в ArrayList построчно?

Буду очень благодарен, если поможете разобраться в общем и целом - что и как лучше применить в моем случае? Есть где-нибудь хороший пример?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2011, 14:10
Ответы с готовыми решениями:

Сохранение текста вместе с картинкой
Здравствуйте ребят, помогите плиз,имеется форма, на форме картинка, а на картинке текст, тоесть компонент tImage и Label который находинся...

Вывод текста в Jeditorpane разным цветом
Хочу вывести разноцветный текст, но при использование этого метода выводится только переменная data3(С нужным, но только одним цветом)....

JTextPane и проблемы с атрибутами текста
Привет. Написал свой редактор формул. Использую JtextPane и новый StyledDocument. Есть зарезервированные слова (функции и переменные). Все...

25
3 / 3 / 0
Регистрация: 25.08.2010
Сообщений: 213
03.01.2011, 16:57
по-моему едитор пейн поддерживает и корректно отображает HTML ...
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
03.01.2011, 17:06  [ТС]
Не могу сообразить:
Java
1
2
3
4
5
6
7
html= new JEditorPane();
html.setContentType('text/html');
b1=new JButton('bold');
html.SetText('я хочу сделать выделение жирным');
b1.actionPerformed ..... {
      Подскажите, плз, что здесь написать?
});
0
3 / 3 / 0
Регистрация: 25.08.2010
Сообщений: 213
03.01.2011, 17:30
String str= html.getText();
html.setText('<b>'+str+'</b>');
По-моему так.
Я не тестил просто догадки, и где-то на форуме видел.
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
03.01.2011, 19:09  [ТС]
Если так сделать получатся html-эквиваленты всем хтмл спецсимволам - &quot и типа того. Как установить этот БОЛД нажатием кнопки, чтобы визуально увидеть жирный шрифт, а не <b>. И заодно, как определить где выделение на котором это должно быть сделано.
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
03.01.2011, 19:12  [ТС]
Что-нибудь вроде
Java
1
2
3
SimpleAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setForeground(attr, Color.red);
textPane.getStyledDocument().setCharacterAttributes(0,20,attr,true);
но getStyledDocument в случае editorPane почему то не поддерживается.
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
04.01.2011, 10:34  [ТС]
Люди - ну помогите!
Перерыл интернет - там куча аналогичных вопросов и ни одного внятного ответа.
0
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
05.01.2011, 01:16
Вся проблема в компоненте JEditorPane, котрый похоже не поддерживает StyledDocument, как альтернативу стоит использовать JTextPane:
Java
1
2
  StyledDocument dsd = new DefaultStyledDocument();
  JTextPane jtp = new JTextPane(dsd);
а в акшине кнопки писать, что и было предложено ранее:
Java
1
2
3
4
5
  MutableAttributeSet mas = new SimpleAttributeSet();
  StyleConstants.setFontFamily(mas, 'Arial');
  StyleConstants.setBackground(mas, Color.red);
  StyleConstants.setItalic(mas, true);
  dsd.setCharacterAttributes(5, 2, mas, false);
0
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
05.01.2011, 02:02
А если, так хочется использовать JEditorPane, тогда есть соответствующий HTMLDocument.
Java
1
2
3
  HTMLDocument hd = new HTMLDocument();
  JEditorPane jep = new JEditorPane();
  jep.setContentType('text/html');
и дальше аналогично:
Java
1
2
3
4
5
  MutableAttributeSet attr = new SimpleAttributeSet();
  StyleConstants.setFontFamily(attr, 'Arial');
  StyleConstants.setBackground(attr, Color.red);
  StyleConstants.setItalic(attr,true);
  hd.setCharacterAttributes(5, 2, attr, false);
Блин, там даже можно с таблицами работать.
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
05.01.2011, 12:24  [ТС]
С JTextPane нет проблем с установкой атрибутов - но как их записать вместе с содержимым файла? Как то их анализировать по ходу записи и изобретать свой формат файла не хочется.
0
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
05.01.2011, 18:41
Да вы чо
вывод:
Java
1
2
3
4
  FileOutputStream fst = new FileOutputStream(new File('new.dat'));
  ObjectOutput oo = new ObjectOutputStream(fst);
  oo.writeObject(TextPane1.getStyledDocument());
  oo.flush();
ввод:
Java
1
2
3
4
  FileInputStream fis = new FileInputStream(new File('new.dat'));
  ObjectInputStream ois = new ObjectInputStream(fis);
  StyledDocument sd = (StyledDocument) ois.readObject();
  TextPane1.setStyledDocument(sd);
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
06.01.2011, 13:52  [ТС]
Очень большое спасибо!
Вот еще бы научиться делать чтение и запись не в файл, а в строку - потому что мне данные нужно хранить в базе. А то я их сперва записываю в файл, потом считываю и загоняю в базу.
0
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
06.01.2011, 22:45
сам не пойму в чём дело, но по идее должно было сработать: в пакете java.io есть два

класса PipedInputStream и PipedOutputStream создающие между собой канал ввода-вывода,
в случае простых обьектов всё работает, а как нужно, по странным обстоятельствам

почемуто не получается, программа просто виснет после writeObject.
Java
1
2
3
4
5
6
  PipedInputStream pis = new PipedInputStream();
  PipedOutputStream pos = new PipedOutputStream();
  pos.connect(pis);
 
  ObjectOutput oo = new ObjectOutputStream(pos);
  oo.writeObject(TextPane1.getStyledDocument());
и если бы всё выгорело, просто:
Java
1
2
3
4
5
6
  conn = DriverManager.getConnection('...');
  String us = 'UPDATE TABLE_1 SET BIN_VALUE=(?) WHERE ID=1;';
  PreparedStatement pstm = conn.prepareStatement(us);
 
  pstm.setBinaryStream(1, pis, 0);
  pstm.executeUpdate();
может кто нибудь из мавров разовьёт эту мысль ?
0
mishgun
07.01.2011, 00:20
My tut podumali i ya reshil)))

Java
1
2
3
4
ObjectOutput oo = new ObjectOutputStream(pos);
pos.close();
pos.flush();
oo.writeObject(TextPane1.getStyledDocument());
Mozhet i nepravilno reshil no vse OutputStream nado zakrivat i flushut chtob pamyat osvobodit)))
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
07.01.2011, 12:39
Неа, тогда ругается что содинение не коннектино между pis и pos, когда доходитдо pstm.setBinaryStream(1, pis, 0). А вообще до меня доперло что просто pstm не считывает поток с обьектом, т.к. он просто читает байты наверняка при помощи read(byte[] bs), а объект напрямую не может быть преобразован в массив байтов. Так что надо посмотреть санавский код, как они серилизуют бобовые объекты в байты, как будет время попробую и обязательно напяшу. Но если кто использует Oracle проблема решается через метод setObject или типы CLOB BLOB стандарта SQL3.
0
mishgun
08.01.2011, 03:41
скорей всего вы проигнорировали мой сообчение что OutputStream надо закрывать .То есть ObjectOutputStream тоже.
Я бы посоветовал вам сделать так

Java
1
2
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
08.01.2011, 08:41  [ТС]
Использую, по вашему совету, readObject и writeObject в файл. Все работает.
Делаю для записи в базу
DB.mysql_update_note(id_reg,'notes',text Pane.getStyledDocument());

для чтения из базы
Java
1
2
3
Object obj= DB.mysql_select_note('SELECT * FROM notes WHERE id='+id_reg);
StyledDocument sd = (StyledDocument) obj;
textPane.setStyledDocument(sd);
мои методы работы с mysql используют только getObject(...) и updateObject(...)

В результате при чтении получаю java.lang.ClassCastException
И дейтвительно - если сразу записать объект в файл (пустое JTextPane) то размер файла будет 60КБ, если его загнать в мускл, считать оттуда и потом записать в файл - получается 90КБ.
В мускле поле типа text.
Просто стало из принципа интересно - кто подскажет что происходит?
0
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
08.01.2011, 14:03
Блин, давайте добъем.
Я пробую на Access, есть таблица TABLE_1 с полем BIN_VALUE бинарного типа.
И есть казалось бы простой код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.io.*;
import java.sql.*;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
 
public class ObjWrite {
  JFrame frame = new JFrame();
  JPanel panel = new JPanel();
  StyledDocument sd = new DefaultStyledDocument();
  JTextPane textPane = new JTextPane(sd);
 
  JButton button = new JButton(new AbstractAction() {
    public void actionPerformed(ActionEvent e) {
      Connection conn;
      String strCon = 'jdbc:odbc:' +
          'DRIVER=Driver do Microsoft Access (*.mdb);' +
          'UserCommitSync=Yes;' +
          'Threads=3;' +
          'SafeTransactions=0;' +
          'PageTimeout=5;' +
          'MaxScanRows=8;' +
          'MaxBufferSize=2048;' +
          'FIL=MS Access;' +
          'DriverId=25;' +
          'DefaultDir=' + System.getProperty('user.dir') + ';' +
          'DBQ=' + System.getProperty('user.dir') + '/db.mdb;';
 
      try {
        Class.forName('sun.jdbc.odbc.JdbcOdbcDriver');
        conn = DriverManager.getConnection(strCon);
        String us = 'INSERT INTO TABLE_1 (BIN_VALUE) VALUES (?);';
        PreparedStatement pstm = conn.prepareStatement(us);
 
        PipedOutputStream pos = new PipedOutputStream();
        PipedInputStream pis = new PipedInputStream(pos);
        
        ObjectOutputStream oo = new ObjectOutputStream(pos);
 
        System.out.println(1);
 
        oo.writeObject(sd);
 
        System.out.println(2);
 
        oo.close();
        oo.flush();
        
        System.out.println(3);
        
        System.out.println('availible: ' + pis.available());
        pstm.setBinaryStream(1, pis, pis.available());
 
        System.out.println(4);
 
        pstm.executeUpdate();
        
        System.out.println(5);
 
        conn.close();
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
 
    }
  }
  );
 
  ObjWrite() {
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(panel, BorderLayout.NORTH);
    frame.getContentPane().add(textPane, BorderLayout.CENTER);
    panel.add(button);
    textPane.setText('Hello World');
    button.setText('Запись');
    frame.setSize(500, 500);
    frame.setVisible(true);
  }
 
  public static void main(String[] args) {
    new ObjWrite();
  }
}
где подключаюсь к базе данных создаю 'трубку' втыкаю в нее ObjectOutputStream, и хочу просто просто записать в поток объект StyledDocument, них..на не выходит, вместо этого программа просто останавливается на oo.writeObject(sd) (System.out.println(n) поставлен для трассировки операций). При этом если написать oo.writeObject('Hello'), т.е. объект это строка тогда все проходит и она оказывается в БД уже в формате Unicode. Может я вообще все не так сделал ?
А по счет MySQL, я думаю что он просто кодирует данные (не знаю во что) т.к. это все работает через http, вот и получается больше, так что на выходе их соответственно нужно раскодировать (тоже не знаю во что). Посмотри может в пакете где лежат его драйвера найдешь что нибудь.
0
0 / 0 / 1
Регистрация: 14.02.2009
Сообщений: 470
08.01.2011, 15:04  [ТС]
Зачем в принципе PipedOutputStream, если по логике можно
пользуясь методом JDBC rs.updateObject(...) а потом rs.insertRow(); или updateRow сразу положить в базу целиком объект?
У меня он успешно кладется и в базе видно, что чо-то там записалось вида, если сделать System.out.println(обьект.toString). Только после чтения, как объект уже не воспринимается, хотя и вроде похож...
0
0 / 0 / 5
Регистрация: 02.10.2009
Сообщений: 37
08.01.2011, 15:52
Может и мускле волшебным образом и проходит (не пробовал драйвера нет), а вот в MSSQL или Access:
Code
1
java.sql.SQLException: Unknown SQL Type for ResultSet.updateObject SQL Type = 1111
Да и вообще вопрос очень интересный: 'крутить' в потоке обьект. Может и не только в базах данных пригодиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2011, 15:52
Помогаю со студенческими работами здесь

Добавление текста в RichTextBox с различными атрибутами
Всем здравствуйте. Как из кода занести в одно и тоже RichTextBox одну строчку со шрифтом синего цвета, а следующую со шрифтом красного...

Использование типов DataContract с другими атрибутами. Прокси класс не генерирует DataContract с атрибутами
Такая проблема. Три дня провозился с сервисом, клиент которого по непонятной мне тогда причине кидал Exception, хотя все было написано...

Сохранение таблицы StringGrid вместе с объектами
Доброго времени суток. Есть StringGrid с закрашенными ячейками. Как сохранить таблицу вместе с цветами ячеек?

Сохранение содержимого richedit в переменную вместе с настройками шрифта
Доброго времени суток. Есть программка, работает хорошо, но есть неувязочка. В процессе работы программы в richedit записывается...

Копирование текста блокнота в textbox1 и сохранение текста в блокноте
Всем привет, прошу помочь с решение задания. Вообщем, суть в том, чтобы из Блокнота(test.txt) текст перенести в TextBox1 (потом я делаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru