2012-08-22 22 views
5

Próbowałem tylko pokolorować tekst w JTextPane - ale problem nie może mieć różnych kolorów dla tekstu i podkreślenia. Jak mam to zrobić, czy jest to możliwe? Poniższy przykład wyświetla cały tekst i podkreśla w CZERWONO.Jak ustawić różne kolory tekstu i podkreślenia w JTextPane?

JTextPane pane = new JTextPane(); 

StyleContext context = new StyleContext(); 

Style style = pane.addStyle("Black", null); 
StyleConstants.setAlignment(style, StyleConstants.ALIGN_RIGHT); 
StyleConstants.setFontSize(style, 14); 
StyleConstants.setSpaceAbove(style, 4); 
StyleConstants.setSpaceBelow(style, 4); 
StyleConstants.setForeground(style, Color.BLACK); 

StyledDocument document = pane.getStyledDocument(); 


style = pane.addStyle("Red Underline", style); 
StyleConstants.setForeground(style, Color.RED); 
StyleConstants.setUnderline(style, true); 

pane.getDocument().insertString(0, "Test String", style); 
+0

+1 Mimo że interfejs Style API wydaje się być rozszerzalny, nie mogłem znaleźć żadnej dokumentacji, jak to zrobić. –

+0

Znaleźliśmy odpowiedź tutaj ... http: // stackoverflow.com/questions/9502654/underline-styleconstant-in-a-different-color-with-attributeset –

+0

Opublikuj jako odpowiedź –

Odpowiedz

2
  • for example i for Html

  • Document powraca modelu, aby zobaczyć, nie jest możliwe określenie wskaźnika gdzie rozpoczął wiersz/zakończony

4

W zasadzie nie ma w 3 grupach ty musisz utworzyć:

  • Musisz przedłużyć javax.swing.text.LabelView, aby wykonać modyfikację widoku, niezależnie od tego, czy chcesz dodać kolorowe podkreślenie, czy nie. Będziesz nadpisywać metodę paint(Graphics, Shape). Możesz uzyskać dostęp do atrybutów za pomocą tego wiersza w nadpisanej klasie - atrybuty powinny być wyzwalaczem do robienia czegoś dodatkowego do tekstu (na przykład dodawania podkreślenia).

    getElement().getAttributes().getAttribute("attribute name");

  • Trzeba utworzyć nowy ViewFactory i nadpisać metodę create. To ważne, gdy w ten sposób obsługiwać wszystkie typy elementów (inaczej rzeczy nie całkiem wyświetlić rację.

  • Musisz utworzyć StyledEditorKit aby powiedzieć okienko które ViewFactory do wykorzystania.

Oto uproszczona i runnable tego przykładem:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.BasicTextPaneUI; 
import javax.swing.text.*; 

public class TempProject extends JPanel{ 


    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       //Adding pane 
       JTextPane pane = new JTextPane(); 
       pane.setEditorKit(new CustomEditorKit()); 
       pane.setText("Underline With Different Color"); 

       //Set Style 
       StyledDocument doc = (StyledDocument)pane.getDocument(); 
       MutableAttributeSet attrs = new SimpleAttributeSet(); 
       attrs.addAttribute("Underline-Color", Color.red); 
       doc.setCharacterAttributes(0, doc.getLength()-1, attrs, true); 

       JScrollPane sp = new JScrollPane(pane); 
       frame.setContentPane(sp); 
       frame.setPreferredSize(new Dimension(400, 300)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 


      } 
     }); 
    } 

    public static class CustomEditorKit extends StyledEditorKit{ 

     public ViewFactory getViewFactory(){ 
      return new CustomUI(); 
     } 
    } 

    public static class CustomUI extends BasicTextPaneUI{ 
     @Override 
     public View create(Element elem){ 
      View result = null; 
      String kind = elem.getName(); 
      if(kind != null){ 
       if(kind.equals(AbstractDocument.ContentElementName)){ 
        result = new MyLabelView(elem); 
       } else if(kind.equals(AbstractDocument.ParagraphElementName)){ 
        result = new ParagraphView(elem); 
       }else if(kind.equals(AbstractDocument.SectionElementName)){ 
        result = new BoxView(elem, View.Y_AXIS); 
       }else if(kind.equals(StyleConstants.ComponentElementName)){ 
        result = new ComponentView(elem); 
       }else if(kind.equals(StyleConstants.IconElementName)){ 
        result = new IconView(elem); 
       } else{ 
        result = new LabelView(elem); 
       } 
      }else{ 
       result = super.create(elem); 
      } 

      return result; 
     } 
    } 

    public static class MyLabelView extends LabelView{ 

     public MyLabelView(Element arg0) { 
      super(arg0); 
     } 

     public void paint(Graphics g, Shape a){ 
      super.paint(g, a); 
      //Do whatever other painting here; 
      Color c = (Color)getElement().getAttributes().getAttribute("Underline-Color"); 
      if(c != null){ 
       int y = a.getBounds().y + (int)getGlyphPainter().getAscent(this); 
       int x1 = a.getBounds().x; 
       int x2 = a.getBounds().width + x1; 

       g.setColor(c); 
       g.drawLine(x1, y, x2, y); 
      } 

     } 

    } 

} 

Oto link do innego przykładowego kodu:

http://java-sl.com/tip_colored_strikethrough.html

Ta odpowiedź jest skierowana głównie do potomności. Pomyślałem, że dodanie uproszczonej wersji połączonego kodu i wyjaśnienie sprawi, że będzie to bardziej zrozumiałe.

+0

dobrze opisane +1 – mKorbel