在java中使用RSyntaxTextArea库的语法高亮netbeans swing

问题描述:

当我在一个单独的类中执行时,文本突出显示用于java语法,例如 TextEditorDemo,但是在执行JCombo的 动作侦听器中的代码时得不到相同的结果使用rsyntaxtextarea对象 - >语法在框中摆动并初始化JtextArea msg1(此处)未被突出显示。在java中使用RSyntaxTextArea库的语法高亮netbeans swing

TextEditorDemo.java

import javax.swing.*; 
import org.fife.ui.rtextarea.*; 
import org.fife.ui.rsyntaxtextarea.*; 

/** 
* A simple example showing how to use RSyntaxTextArea to add Java syntax 
* highlighting to a Swing application.<p> 
*/ 
public class TextEditorDemo extends JFrame { 

    public TextEditorDemo() { 

     JPanel cp = new JPanel(); 

     RSyntaxTextArea syntaxTextArea = new RSyntaxTextArea(20, 60); 
     syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); 
     // No other property of RSyntaxTextArea is allowed to use 

     // You can now modify textArea object similar to any other JTextArea object to add other functionality 
     JTextArea textArea = syntaxTextArea; 
     JScrollPane sp = new JScrollPane(textArea); 
     cp.add(sp); 

     setContentPane(cp); 
     setTitle("Text Editor Demo"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     // Start all Swing applications on the EDT. 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new TextEditorDemo().setVisible(true); 
     } 
     }); 
    } 

} 

JComboBox的动作侦听器 -

private void language1ActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 


     RSyntaxTextArea syntaxTextArea = new RSyntaxTextArea(6, 20); 

     String lang = (String) language1.getSelectedItem(); 
     syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); 
     msg1 = syntaxTextArea; 
     msg1.setVisible(true); 
     System.out.println("language "+lang); 
     if (lang.equals("JAVA")) { 
      syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); 
     } 
     else if(lang.equals("C")){ 
      syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_C); 
     } 
     else if(lang.equals("CSHARP")){ 
      syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_CSHARP); 
     } 
     else if(lang.equals("CSS")){ 
      syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_CSS); 
     } 

     //syntaxTextArea.setCodeFoldingEnabled(true);*/ 

    } 

private void language1ActionPerformed(java.awt.event.ActionEvent evt) {           
     RSyntaxTextArea syntaxTextArea = new RSyntaxTextArea(6, 20); 

     String lang = (String) language1.getSelectedItem(); 
     syntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); 
     msg1 = syntaxTextArea; 
     msg1.setVisible(true); 

上面的代码什么也不做。您尚未将语法区域组件添加到框架。

请勿创建新的RSyntaxArea对象!

相反,您需要在您的类中使syntaxTextArea为实例变量,然后才可以从侦听器引用该变量并更改编辑样式属性。

或者,如果由于某种原因,类不允许你动态地更改属性,那么你将需要使用:

sp.setViewportView(syntaxTextArea); 
在您收听代码

。在这种情况下,scrollpane变量现在需要是类中的实例变量。

无论哪种方式,您将需要创建一个实例变量,可以从您的ActionListener引用,因此您将需要重构您的代码。请阅读How to Use Text Areas的Swing教程。这里的演示代码将告诉你如何更好地构建你的类。