Ich versuche Text Hervorhebung in JTextPane zu tun. Ich verwende SwingWorker, um im Hintergrund zu markieren. Aber ich kann die gewünschte Ausgabe nicht bekommen.
My-Code ist wie folgt:
Hauptklasse:Syntax-Hervorhebung in JTextPane mit SwingWorker
class MultiColor {
private static void displayGUI() {
final JTextPane ta = new JTextPane();
JFrame frame = new JFrame("EXAMPLE");
JButton jb = new JButton("Change");
JScrollPane jsp = new JScrollPane(ta);
frame.add(jsp, BorderLayout.CENTER);
frame.add(jb, BorderLayout.PAGE_END);
frame.pack();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
Modify mm = new Modify(ta);
mm.execute();
}
});
}
public static void main(String[] a) {
Runnable r = new Runnable() {
@Override
public void run() {
displayGUI();
}
};
SwingUtilities.invokeLater(r);
}
}
und Modify-Klasse ist:
class Modify extends SwingWorker<Void,Object> {
private JTextPane ta;
private StyleContext style;
private AttributeSet textStyle;
public Modify(JTextPane text) {
ta = text;
}
private void matching(String str){
style = StyleContext.getDefaultStyleContext();
textStyle = style.addAttribute(style.getEmptySet(),StyleConstants.Foreground, Color.red);
textStyle = style.addAttribute(textStyle,StyleConstants.FontSize, 15);
String regx = "\\b(class|int|void|static|final|public|private|protected|float|if|else|for|while|try|catch|boolean|import|return)\\b";
String input = str;
Pattern p = Pattern.compile(regx);
Matcher m = p.matcher(input);
while(m.find())
ta.getStyledDocument().setCharacterAttributes(m.start(),(m.end() - m.start()),textStyle, false);
}
@Override
protected Void doInBackground() {
matching(ta.getText());
return null;
}
@Override
protected void done() {
}
}
Und meine Ausgabe lautet:
Ich möchte alle Schlüsselwörter mit angegebenem Textstil anzeigen.
Wie bekomme ich gewünschte Ausgabe.
DoInBackground ist Arbeiterthread, nicht festgelegt, um etwas in Swing GUI zu ändern, müssten Sie publish() oder setProcess verwenden – mKorbel