Text inputted in RSyntaxTextArea shown with strange encoding

714 views Asked by At

In my project I want to have a built in editor for java source code, with auto completion and syntax highlighting and I chose the RSyntaxTextArea for that. I tried to run the minimalistic examples from the project website, but as soon as I use the actual version 2.5.6, the inputted text is encoded in strange characters As soon as I downgrade the version of the lib to 2.0.2 it works, but this version does not support the code completion I need.

My Code:

public class Main3 extends JFrame
{
    public Main3() {
    setRootPane(new DemoRootPane());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setTitle("RSyntaxTextArea Demo Application");
    pack();
}


    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.
                        getSystemLookAndFeelClassName());
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            } catch (Exception e) {
                e.printStackTrace(); // Never happens
            }
            Toolkit.getDefaultToolkit().setDynamicLayout(true);
            new Main3().setVisible(true);
        }
    });
}


}




import org.fife.ui.rsyntaxtextarea.ErrorStrip;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rsyntaxtextarea.Theme;
import org.fife.ui.rtextarea.Gutter;
import org.fife.ui.rtextarea.RTextScrollPane;

import javax.swing.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class DemoRootPane extends JRootPane implements HyperlinkListener,
    SyntaxConstants
{

private RTextScrollPane scrollPane;
private RSyntaxTextArea textArea;


public DemoRootPane()
{
    textArea = createTextArea();
    setText("JavaExample.txt");
    textArea.setSyntaxEditingStyle(SYNTAX_STYLE_JAVA);

    scrollPane = new RTextScrollPane(textArea, true);
    Gutter gutter = scrollPane.getGutter();
    gutter.setBookmarkingEnabled(true);
    URL url = getClass().getClassLoader().getResource("bookmark.png");
//        gutter.setBookmarkIcon(new ImageIcon(url));
    getContentPane().add(scrollPane);
    ErrorStrip errorStrip = new ErrorStrip(textArea);
    getContentPane().add(errorStrip, BorderLayout.LINE_END);
    setJMenuBar(createMenuBar());
}


private void addSyntaxItem(String name, String res, String style,
                           ButtonGroup bg, JMenu menu)
{
    JRadioButtonMenuItem item = new JRadioButtonMenuItem(
            new ChangeSyntaxStyleAction(name, res, style));
    bg.add(item);
    menu.add(item);
}


private void addThemeItem(String name, String themeXml, ButtonGroup bg,
                          JMenu menu)
{
    JRadioButtonMenuItem item = new JRadioButtonMenuItem(
            new ThemeAction(name, themeXml));
    bg.add(item);
    menu.add(item);
}


private JMenuBar createMenuBar()
{

    JMenuBar mb = new JMenuBar();

    JMenu menu = new JMenu("Language");
    ButtonGroup bg = new ButtonGroup();
    addSyntaxItem("C", "CExample.txt", SYNTAX_STYLE_C, bg, menu);
    addSyntaxItem("Java", "JavaExample.txt", SYNTAX_STYLE_JAVA, bg, menu);
    addSyntaxItem("Perl", "PerlExample.txt", SYNTAX_STYLE_PERL, bg, menu);
    addSyntaxItem("Ruby", "RubyExample.txt", SYNTAX_STYLE_RUBY, bg, menu);
    addSyntaxItem("SQL", "SQLExample.txt", SYNTAX_STYLE_SQL, bg, menu);
    addSyntaxItem("XML", "XMLExample.txt", SYNTAX_STYLE_XML, bg, menu);
    menu.getItem(1).setSelected(true);
    mb.add(menu);

    menu = new JMenu("View");
    JCheckBoxMenuItem cbItem = new JCheckBoxMenuItem(new CodeFoldingAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new ViewLineHighlightAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new ViewLineNumbersAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new AnimateBracketMatchingAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new BookmarksAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new WordWrapAction());
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new ToggleAntiAliasingAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new MarkOccurrencesAction());
    cbItem.setSelected(true);
    menu.add(cbItem);
    cbItem = new JCheckBoxMenuItem(new TabLinesAction());
    menu.add(cbItem);
    mb.add(menu);

    bg = new ButtonGroup();
    menu = new JMenu("Themes");
    addThemeItem("Default", "/default.xml", bg, menu);
    addThemeItem("Default (Alternate)", "/default-alt.xml", bg, menu);
    addThemeItem("Dark", "/dark.xml", bg, menu);
    addThemeItem("Eclipse", "/eclipse.xml", bg, menu);
    addThemeItem("IDEA", "/idea.xml", bg, menu);
    addThemeItem("Visual Studio", "/vs.xml", bg, menu);
    mb.add(menu);

    menu = new JMenu("Help");
    JMenuItem item = new JMenuItem(new AboutAction());
    menu.add(item);
    mb.add(menu);

    return mb;

}


/**
 * Creates the text area for this application.
 *
 * @return The text area.
 */
private RSyntaxTextArea createTextArea()
{
    RSyntaxTextArea textArea = new RSyntaxTextArea(25, 70);
    textArea.setTabSize(3);
    textArea.setCaretPosition(0);
    textArea.addHyperlinkListener(this);
    textArea.requestFocusInWindow();
    textArea.setMarkOccurrences(true);
    textArea.setCodeFoldingEnabled(true);
    textArea.setClearWhitespaceLinesEnabled(false);
    return textArea;
}


/**
 * Focuses the text area.
 */
void focusTextArea()
{
    textArea.requestFocusInWindow();
}


/**
 * Called when a hyperlink is clicked in the text area.
 *
 * @param e The event.
 */
public void hyperlinkUpdate(HyperlinkEvent e)
{
    if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
    {
        URL url = e.getURL();
        if (url == null)
        {
            UIManager.getLookAndFeel().provideErrorFeedback(null);
        }
        else
        {
            JOptionPane.showMessageDialog(this,
                    "URL clicked:\n" + url.toString());
        }
    }
}


/**
 * Sets the content in the text area to that in the specified resource.
 *
 * @param resource The resource to load.
 */
private void setText(String resource)
{
    ClassLoader cl = getClass().getClassLoader();
    BufferedReader r = null;
    try
    {
        r = new BufferedReader(new InputStreamReader(
                cl.getResourceAsStream(resource), "UTF-8"));
        textArea.read(r, null);
        r.close();
        textArea.setCaretPosition(0);
        textArea.discardAllEdits();
    }
    catch (RuntimeException re)
    {
        throw re; // FindBugs
    }
    catch (Exception e)
    { // Never happens
        textArea.setText("Type here to see syntax highlighting");
    }
}


private class AboutAction extends AbstractAction
{

    public AboutAction()
    {
        putValue(NAME, "About RSyntaxTextArea...");
    }

    public void actionPerformed(ActionEvent e)
    {
        JOptionPane.showMessageDialog(DemoRootPane.this,
                "<html><b>RSyntaxTextArea</b> - A Swing syntax highlighting text component" +
                        "<br>Version 2.0.7" +
                        "<br>Licensed under a modified BSD license",
                "About RSyntaxTextArea",
                JOptionPane.INFORMATION_MESSAGE);
    }

}


private class AnimateBracketMatchingAction extends AbstractAction
{

    public AnimateBracketMatchingAction()
    {
        putValue(NAME, "Animate Bracket Matching");
    }

    public void actionPerformed(ActionEvent e)
    {
        textArea.setAnimateBracketMatching(
                !textArea.getAnimateBracketMatching());
    }

}


private class BookmarksAction extends AbstractAction
{

    public BookmarksAction()
    {
        putValue(NAME, "Bookmarks");
    }

    public void actionPerformed(ActionEvent e)
    {
        scrollPane.setIconRowHeaderEnabled(
                !scrollPane.isIconRowHeaderEnabled());
    }

}


private class ChangeSyntaxStyleAction extends AbstractAction
{

    private String res;
    private String style;

    public ChangeSyntaxStyleAction(String name, String res, String style)
    {
        putValue(NAME, name);
        this.res = res;
        this.style = style;
    }

    public void actionPerformed(ActionEvent e)
    {
        setText(res);
        textArea.setCaretPosition(0);
        textArea.setSyntaxEditingStyle(style);
    }

}


private class CodeFoldingAction extends AbstractAction
{

    public CodeFoldingAction()
    {
        putValue(NAME, "Code Folding");
    }

    public void actionPerformed(ActionEvent e)
    {
        textArea.setCodeFoldingEnabled(!textArea.isCodeFoldingEnabled());
    }

}


private class MarkOccurrencesAction extends AbstractAction
{

    public MarkOccurrencesAction()
    {
        putValue(NAME, "Mark Occurrences");
    }

    public void actionPerformed(ActionEvent e)
    {
        textArea.setMarkOccurrences(!textArea.getMarkOccurrences());
    }

}


private class TabLinesAction extends AbstractAction
{

    private boolean selected;

    public TabLinesAction()
    {
        putValue(NAME, "Tab Lines");
    }

    public void actionPerformed(ActionEvent e)
    {
        selected = !selected;
        textArea.setPaintTabLines(selected);
    }

}


private class ThemeAction extends AbstractAction
{

    private String xml;

    public ThemeAction(String name, String xml)
    {
        putValue(NAME, name);
        this.xml = xml;
    }

    public void actionPerformed(ActionEvent e)
    {
        InputStream in = getClass().getResourceAsStream(xml);
        try
        {
            Theme theme = Theme.load(in);
            theme.apply(textArea);
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }
    }

}


private class ToggleAntiAliasingAction extends AbstractAction
{

    public ToggleAntiAliasingAction()
    {
        putValue(NAME, "Anti-Aliasing");
    }

    public void actionPerformed(ActionEvent e)
    {
        textArea.setAntiAliasingEnabled(!textArea.getAntiAliasingEnabled());
    }

}


private class ViewLineHighlightAction extends AbstractAction
{

    public ViewLineHighlightAction()
    {
        putValue(NAME, "Current Line Highlight");
    }

    public void actionPerformed(ActionEvent e)
    {
        textArea.setHighlightCurrentLine(
                !textArea.getHighlightCurrentLine());
    }

}


private class ViewLineNumbersAction extends AbstractAction
{

    public ViewLineNumbersAction()
    {
        putValue(NAME, "Line Numbers");
    }

    public void actionPerformed(ActionEvent e)
    {
        scrollPane.setLineNumbersEnabled(
                !scrollPane.getLineNumbersEnabled());
    }

}


private class WordWrapAction extends AbstractAction
{

    public WordWrapAction()
    {
        putValue(NAME, "Word Wrap");
    }

    public void actionPerformed(ActionEvent e)
    {
        textArea.setLineWrap(!textArea.getLineWrap());
    }

}
}
1

There are 1 answers

0
NonSense On

The problem is solved by setting a concrete Font for the RSyntaxTextArea in createTextArea()

textArea.setFont(new Font("Monospaced", Font.PLAIN, 12));