2012-11-08 21 views
5

Sto provando a creare un piccolo HTML-wysiwyg con uno JTextPane ma non riesco a far funzionare lo BackgroundAction. Sto usando setCharacterAttributes su StyledDocument del JTextPane ma sembra problematico. La vista è ok ma il Document non lo è.Il colore di sfondo del testo JTextPane non funziona

Ecco un piccolo codice dimostrativo che illustra il problema. Ci sono 2 JTextPane:

  1. ho impostato il colore della mia sfondo del testo nella prima
  2. posso recuperare il testo del primo JTextPane e impostarlo sulla seconda

        -> Non mostrano la stessa cosa nonostante abbiano lo stesso testo.

C'è un modo per impostare il colore di sfondo sul testo selezionato corrente e fare in modo che lo JTextPane indichi un testo HTML aggiornato?

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyledDocument; 

public class TestDifferentStyles { 

    private void initUI() { 
     JFrame frame = new JFrame(TestDifferentStyles.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JTextPane textPane = new JTextPane(); 
     final JTextPane textPane2 = new JTextPane(); 
     textPane2.setEditable(false); 
     textPane.setContentType("text/html"); 
     textPane2.setContentType("text/html"); 
     textPane.setText("<html><head></head><body><p>Hello world</p></body></html>"); 
     SimpleAttributeSet set = new SimpleAttributeSet(); 
     StyleConstants.setForeground(set, Color.GREEN); 
     StyleConstants.setBackground(set, Color.BLACK); 
     ((StyledDocument) textPane.getDocument()).setCharacterAttributes(0, textPane.getDocument().getLength(), set, false); 

     JPanel panel = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     panel.add(textPane, gbc); 
     panel.add(textPane2, gbc); 
     frame.add(panel); 
     frame.setSize(500, 400); 
     frame.setVisible(true); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       System.err.println(textPane.getText()); 
       textPane2.setText(textPane.getText()); 
      } 
     }); 
    } 

    public static void main(String[] args) { 

     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestDifferentStyles().initUI(); 
      } 
     }); 
    } 

} 

Il risultato di uscita (il bordo nero sono attorno a ciascuna JTextPane): output result

+0

devono aspettare @Stanislav, ha soluzioni per la sostituzione Carer, selezioni e HightLighter, penso che si tratta di UImanager e le sue XxxResources, – mKorbel

+0

@mKorbel ok grazie. Aspetterò StanislavL quindi :-) –

+0

Vedi anche 'HTMLDocumentEditor 'di Charles Bell, citato [qui] (http://stackoverflow.com/a/5899816/230513). – trashgod

risposta

5

Ecco il codice per un'azione che può impostare il colore di sfondo:

public class BackgroundColorAction extends StyledEditorKit.StyledTextAction { 

    private Color color; 

    public BackgroundColorAction(Color color) { 
     super(StyleConstants.Background.toString()); 
     this.color = color; 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     JEditorPane editor = getEditor(ae); 
     if (editor == null) { 
      return; 
     } 
     //Add span Tag 
     String htmlStyle = "background-color:" + Util.getHTMLColor(color); 
     SimpleAttributeSet attr = new SimpleAttributeSet(); 
     attr.addAttribute(HTML.Attribute.STYLE, htmlStyle); 
     MutableAttributeSet outerAttr = new SimpleAttributeSet(); 
     outerAttr.addAttribute(HTML.Tag.SPAN, attr); 
     //Next line is just an instruction to editor to change color 
     StyleConstants.setBackground(outerAttr, this.color); 
     setCharacterAttributes(editor, outerAttr, false); 
    } 
} 

ho avuto molto di difficoltà nell'impostazione del colore di sfondo. Ma alla fine sono riuscito a risolverlo. Scusa se ho dimenticato di pubblicare la subroutine. Qui si va:

/** 
* Convert a Java Color to equivalent HTML Color. 
* 
* @param color The Java Color 
* @return The String containing HTML Color. 
*/ 
public static String getHTMLColor(Color color) { 
    if (color == null) { 
     return "#000000"; 
    } 
    return "#" + Integer.toHexString(color.getRGB()).substring(2).toUpperCase(); 
} 
+0

Impossibile trovare un pacchetto appropriato per la classe 'Util' e non sembra essere un campo. Potresti far luce su ciò che 'Util' si riferisce a questa linea: 'Util.getHTMLColor (colore);' –

+0

@NickRippe Non avevo ancora il tempo di verificare il codice (lo farò al più presto), ma sto indovinando che fa qualcosa del genere: '" # "+ String.format ("% 1 $ 02x% 2 $ 02x% 3 $ 02x ", color.getRed(), color.getGreen(), color.getBlue())' –

+0

Appena verificato e funziona come un fascino. +1 e risposta accettata. –