2013-03-31 3 views
2

Привет Я пытаюсь выяснить, можно ли применить цвет фона только к части JTextpane? Например, если у меня есть JTextpane размером 300 X 400, то могу ли я применить некоторый цвет к части 300 X 200?Можно ли окрасить только часть JTextpane?

Я не размещаю никакого кода, поскольку у меня его нет.

Например: enter image description here

+1

Вы пытаетесь [выделите текст] (http://stackoverflow.com/q/5674128/230513)? – trashgod

+0

Это непростая задача. Проблема в том, что текст окрашен как часть вызова paintComponent, который также рисует фон. То, что вам нужно сделать, - установить прозрачность текстовой панели (setOpaque (false)), переопределить paintComponent, нарисовать фон, нарисовать свой цвет и вызвать super.paintComoponent last – MadProgrammer

+0

Спасибо, попробуем это. Я опубликовал образец скриншота выше – user001

ответ

2

Вам просто нужно добавить StyleConstants.Background, в качестве параметра addAttribute() в StyleContext, который будет возвращать один AttributeSet объект. Надеюсь, что это то, что вы ищете:

import java.awt.*;  
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

import javax.swing.text.AttributeSet; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyleContext; 

public class TextPaneTest extends JFrame 
{ 
    private JPanel topPanel; 
    private JTextPane tPane; 

    public TextPaneTest() 
    { 
     topPanel = new JPanel();   

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);    

     EmptyBorder eb = new EmptyBorder(new Insets(10, 10, 10, 10)); 

     tPane = new JTextPane();     
     tPane.setBorder(eb); 
     //tPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); 
     tPane.setMargin(new Insets(5, 5, 5, 5)); 

     topPanel.add(tPane); 

     appendToPane(tPane, "My Name is Too Good.\n", Color.RED, Color.WHITE); 
     appendToPane(tPane, "I wish I could be ONE of THE BEST on ", Color.WHITE, Color.BLUE); 
     appendToPane(tPane, "Stack", Color.DARK_GRAY, Color.BLACK); 
     appendToPane(tPane, "Over", Color.MAGENTA, Color.BLUE); 
     appendToPane(tPane, "flow", Color.ORANGE, Color.YELLOW); 

     getContentPane().add(topPanel); 

     pack(); 
     setVisible(true); 
    } 

    private void appendToPane(JTextPane tp, String msg, Color f, Color b) 
    { 
     StyleContext sc = StyleContext.getDefaultStyleContext(); 
     AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, f); 
     aset = sc.addAttribute(aset, StyleConstants.Background, b); 

     aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console"); 
     aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED); 

     int len = tp.getDocument().getLength(); 
     tp.setCaretPosition(len); 
     tp.setCharacterAttributes(aset, false); 
     tp.replaceSelection(msg); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        new TextPaneTest(); 
       } 
      }); 
    } 
} 

Вот результат:

TEXTPANE

+0

Привет, Гагард, спасибо за ответ. Но я не ищу этого. Я считаю, что приведенный выше пример только подчеркивает текст, но не окрашивает всю панель с левого конца на правый. Я ищу что-то вроде скриншота, приведенного в моем вопросе – user001

Смежные вопросы