Цвет disabled JTextPane
От: Antei США  
Дата: 15.06.07 11:11
Оценка:
Имеется JTextPane, в ней форматированный разноцветный текст.
Если JTextPane задизаблить, то текст становится серого цвета. Каким образом можно заставить JTextPane и в disabled состоянии отображать цветной текст?
Re: Цвет disabled JTextPane
От: Blazkowicz Россия  
Дата: 15.06.07 11:18
Оценка:
Здравствуйте, Antei, Вы писали:

A>Имеется JTextPane, в ней форматированный разноцветный текст.

A>Если JTextPane задизаблить, то текст становится серого цвета. Каким образом можно заставить JTextPane и в disabled состоянии отображать цветной текст?

Использовать setEditable вместо setEnabled?
Re[2]: Цвет disabled JTextPane
От: Antei США  
Дата: 15.06.07 11:55
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Использовать setEditable вместо setEnabled?

Нет, мне как раз нужно то что написано в вопросе.

У меня есть компонент который в своем составе содержит JTextPane. Есть 2 режима работы этого компонента:
1 — Как некий объект которому мышкой можно менять размер, двигать, передвигать между родителями и пр. В этом случае JTextPane задизаблен и все события мыши я спокойно перехватываю и делаю что мне надо.
2 — Непосредственно редактирование текста. Соответственно все мышиные события обрабатываются редактором (двигают курсор, выделяют текст и пр.)

Но в случае когда JTextPane задизаблен заказчик требует чтобы я отображал цветной текст ("задизабленость" будет видна по другим критериям).
Re[3]: Цвет disabled JTextPane
От: Antei США  
Дата: 17.06.07 18:31
Оценка:
Может кому будет пригодится:

Изначально пришла идея как-то перегрузить/изменить логику отображения задизабленного текста в UI манагере. Начал с WindowsTextPaneUI-BasicTextPaneUI-BasicEditorPaneUI-BasicTextUI, вышел на ParagraphView, а из него на GlyphView. Фиг там, логика отображения гвоздями прибита. Может как-то и можно было через Highlighter перерисовать текст, но дальше разбираться не стал.

Пришла мысль поколдовать с MouseListerer'ами в том же BasicTextUI. В общем, подобная ситуация, если не вдаваться в детали.

По итогу, написал все в несколько строчек, как изначально проскакивала мысль:

private class InnerTextPane extends JTextPane {
    private BufferedImage m_img;

    public void setEnabled(boolean b){
        if( this.isEnabled() && !b && 0<this.getWidth() && 0<this.getHeight() ){
            m_img = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = m_img.createGraphics();
            this.paint(g2);
        }
        else
            m_img = null;

        super.setEnabled(b);
    }


    public void paint(Graphics g) {
        if( !this.isEnabled() && m_img!=null )
            g.drawImage(m_img, 0, 0, null);
        else
            super.paint(g);
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.