Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Проблемы с JTextPane


Автор: Jilian 17.5.2006, 19:06
У меня возникла такая проблема. У меня есть главный Frame, в нем находится 
JTextPane. Так же у меня вызывается второй Frame, в котором содержиться
JComboBox с шрифтами. Хочу, чтоб при выборе элемента в combo, тут же 
менялся шрифт выделенной подстроки в TextPane. В данной релизации - 
TextPane просто ощищается. Подскажите, пожалуйста, в чем дело.
Это описание фрейма с combo
Код

                           JFrame fr = new JFrame("Fonts");
            fr.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            fr.setSize(300, 150);

            Container contentPane = fr.getContentPane();
            contentPane.setLayout(null);
            String[] fonts;
            GraphicsEnvironment ge = GraphicsEnvironment
                    .getLocalGraphicsEnvironment();
            fonts = ge.getAvailableFontFamilyNames();

            JComboBox combo = new JComboBox();
            for (int i = 0; i < fonts.length; i++)
                combo.addItem(fonts[i]);
            combo.setBounds(0, 0, 100, 30);

            contentPane.add(combo);
            combo.addItemListener(this);
            fr.setVisible(true);



А это непосредственно обработка выбора шрифта
Код

public void itemStateChanged(ItemEvent e) {
        String St = (String) e.getItem();
        DefaultStyledDocument dsd = new DefaultStyledDocument();
        tp.setDocument(dsd);
        SimpleAttributeSet sas1 = new SimpleAttributeSet();
        StyleConstants.setFontFamily(sas1, St);
        dsd.setCharacterAttributes(tp.getSelectionStart(),
                tp.getSelectionEnd(), sas1, false);
    };

    private JTextPane tp;

 

Автор: LSD 17.5.2006, 20:43
Ну конечно, обнуляется. Ты же в 4-ой строке создаешь новый DefaultStyledDocument, а затем устанавливаешь для него атрибуты. Тебе надо получить у JTextPane его документ, и уже для него устанавливать атрибуты.
Код
DefaultStyledDocument dsd = (DefaultStyledDocument) tp.getDocument();
 

Автор: Jilian 17.5.2006, 21:09
Да, спасибо, но исправив эту строчку, получается измениение шрифта от начала выделения и до конца строки. В чем тут дело?

Добавлено @ 21:12 
Код

    public void itemStateChanged(ItemEvent e) {
        String St = (String) e.getItem();
        DefaultStyledDocument dsd = (DefaultStyledDocument) tp.getDocument();
        tp.setDocument(dsd);
        SimpleAttributeSet sas1 = new SimpleAttributeSet();
        StyleConstants.setFontFamily(sas1, St);
[B]        dsd.setCharacterAttributes(tp.getSelectionStart(),
                tp.getSelectionEnd(), sas1, false);[/B]
    };

 Ведь по идее должен изменять только выделенный фрагмент? Или я не права? 

Автор: LSD 17.5.2006, 21:20
Потому что, метод setCharacterAttributes() принимает в качестве параметров, начало фрагмента и его длинну, а не конец. Т.е. надо писать:
Код
dsd.setCharacterAttributes(textPane.getSelectionStart(), textPane.getSelectionEnd() - textPane.getSelectionStart(), sas1, false);
 

Автор: Jilian 17.5.2006, 21:37
to LSD
Большое спасибо!!! 

Теперь моя прога окончательно готова, недельный труд... Пойду сдавать преподу! 

Автор: LSD 17.5.2006, 21:50
Пожалуйста и удачно сдать smile  

Автор: Jilian 17.5.2006, 22:07
 Спасибо! Такой отличный форум - сразу получаю ответ на свой вопрос. 
 Всем, кто мне помогал, спасибочки большое. 

Автор: LSD 17.5.2006, 22:14
Заходи почаще, у нас можно и на http://forum.vingrad.ru/index.php?showforum=24 пообщаться. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)