[Megoldva:] Formázott szöveg írása JEditorPane-re

Fórumok

Sziasztok!

Próbálok formázott szöveget írni JEditorPane szövegmezőbe, de nem megy. Valami ismeret még hiányzik, amitől működne a program. Mind a két mondatot az alapértelmezett stílusban írja ki, rá se bagózik, hogy én az insertString() függvényben két különböző attribútumot adtam meg a kiírandó szövegeknek. Szerintetek mi kell még a progiba, hogy működjön?


import javax.swing.*;
import javax.swing.text.*; 

public class StyledText extends JFrame {
    JEditorPane ep = new JEditorPane();
    JScrollPane scrp;

    public StyledText() {
        super("Styled Text Example");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(50, 50, 500, 500);
        getContentPane().add(scrp = new JScrollPane(ep));
        writeText();

        setVisible(true);
    }
    
    public void writeText() {
        Document doc = ep.getDocument();
        SimpleAttributeSet a1 = new SimpleAttributeSet();
        StyleConstants.setBold(a1, true);
        StyleConstants.setFontSize(a1, 16);
        SimpleAttributeSet a2 = new SimpleAttributeSet();
        StyleConstants.setBold(a2, false);
        StyleConstants.setFontSize(a2, 18);
        try {
            doc.insertString(doc.getLength(), "Ez az első szöveg.\n", a1);
            doc.insertString(doc.getLength(), "Ez pedig a második szöveg.\n", a2);
        }
        catch (BadLocationException badLocationException) {
            System.err.println("Oops");
        }


    }
    
    public static void main(String[] args) {
        StyledText st = new StyledText();
    }

}

Hozzászólások

Tele van példákkal a net..
Csak egy tipp, mert többet nem ér:
neked nem gyanús a "Constants" szó az osztály nevében?

Csak azért írok még egyszer, mert sikerült megoldanom. És ha véletlenül valaki erre az oldalra találna rá a jövőben ilyen probléma esetén, akkor legyen kész megoldása is.

A megoldás fontos része, hogy nem JEditorPane objektumot, hanem JTextPane-t kell létrehozni a programban. Annak setCharacterAttributes() tagfüggvényével már könnyen be lehet állítani a kívánt stílust.

A megoldás:


import java.awt.*;
import javax.swing.*;
import javax.swing.text.*; 

public class StyledText extends JFrame {
    JTextPane tp = new JTextPane();
    JScrollPane scrp;

    public StyledText() {
        super("Styled Text Example");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(50, 50, 500, 500);
        getContentPane().add(scrp = new JScrollPane(tp));
        writeText();
        setVisible(true);
    }
    
    public void writeText() {
        Document doc = tp.getDocument();

        SimpleAttributeSet a1 = new SimpleAttributeSet();
        StyleConstants.setBold(a1, true);
        StyleConstants.setFontSize(a1, 18);
        StyleConstants.setForeground(a1, Color.BLUE);
        StyleConstants.setFontFamily(a1, "MONOSPACED");
        
        SimpleAttributeSet a2 = new SimpleAttributeSet();
        StyleConstants.setBold(a2, false);
        StyleConstants.setFontSize(a2, 16);
        StyleConstants.setForeground(a2, Color.RED);
        StyleConstants.setFontFamily(a2, "ARIAL");
        
        try {
            doc.insertString(doc.getLength(), "Ez az első szöveg.\n", null);
            int i = doc.getLength();
            tp.select(0, i);
            tp.setCharacterAttributes(a1, false);
            
            doc.insertString(doc.getLength(), "Ez pedig a második szöveg.\n", null);
            tp.select(i, doc.getLength());
            tp.setCharacterAttributes(a2, false);

            tp.select(doc.getLength(), doc.getLength());
        }
        catch (BadLocationException badLocEx) {
            System.err.println("Oops");
        }
    } // end of writeText()
    
    public static void main(String[] args) {
        StyledText st = new StyledText();
    }

} // end of class

Van azért olyan megoldás is, amely esetén nem szükséges a beszúrt szövegek újbóli kiszelektálása és formázása.
Tanulság: A fő problémám az volt, hogy JEditorPane objektumon belül próbáltam megoldani a feladatot, de az nem nagyon hajlandó ilyen dolgokat megcsinálni.

Íme a végleges megoldás:


import java.awt.*;
import javax.swing.*;
import javax.swing.text.*; 

public class StyledText extends JFrame {
    JTextPane tp = new JTextPane();
    JScrollPane scrp;
    Style style;

    public StyledText() {
        super("Styled Text Example");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(50, 50, 500, 500);
        getContentPane().add(scrp = new JScrollPane(tp));
        
        StyleContext context = new StyleContext();
        style = context.getStyle(StyleContext.DEFAULT_STYLE);
        StyleConstants.setFontSize(style, 18);
        StyleConstants.setSpaceAbove(style, 3);
        StyleConstants.setSpaceBelow(style, 5);
        StyleConstants.setFontFamily(style, "MONOSPACED");
       
        writeText();
        setVisible(true);
    } // end of StyledText()
    
    public void writeText() {
        Document doc = tp.getDocument();

        SimpleAttributeSet a1 = new SimpleAttributeSet(style);
        StyleConstants.setBold(a1, true);
        StyleConstants.setForeground(a1, Color.BLUE);
        
        SimpleAttributeSet a2 = new SimpleAttributeSet(style);
        StyleConstants.setFontSize(a2, 16);
        StyleConstants.setForeground(a2, Color.RED);
        StyleConstants.setFontFamily(a2, "ARIAL");
        
        try {
            doc.insertString(doc.getLength(), "Ez az első szöveg.\n", a1);
            doc.insertString(doc.getLength(), "Ez pedig a második szöveg.\n", a2);
        }
        catch (BadLocationException badLocEx) {
            System.err.println("Oops");
        }
    } // end of writeText()
    
    public static void main(String[] args) {
        StyledText st = new StyledText();
    }

} // end of class