1

私は現在、Java での C プログラミング用の非常に単純な IDE に取り組んでいます。簡単に言えば、マイナーなコード推測 (Eclipse に似ています)、いくつかのマイナーな自動補完 (もう一度、Eclipse を考えてください)、およびいくつかの構文の強調表示があることを意味します。適切な構文の強調表示に問題があることを除いて、ほぼすべてを把握して大まかにまとめました(つまり、機能しますが、きれいでも効率的でもありません)。

つまり、私のコード JFrame では、JTextPane を配置して、さまざまなフォント、太字、太字の解除、イタリック体を使用し、さまざまなテキストの色を比較的簡単に追加できるようにしました。この JTextPane に接続されたキー リスナーがあり、スペース キーを押すたびに、今書いた内容を取得し、「if」ステートメント ツリーを実行して、書いた単語がキーワードかどうかを確認します。そうした場合、それはあなたが書いたものを強調表示しようとします (または強調表示しません)。ただし、スペースバーを押す前に色を変更する必要がある場合があります (コメントや #define ステートメントなど)。問題ありませんよね?別の「if」ステートメントを追加して、そのキーが押されたかどうかを検出し、押された場合はフォントの色を変更します。まあ、それは私がやろうとしたことですが、うまくいきません。

意味が分からなかったら申し訳ありませんが、必要に応じてもう少し説明させていただきます。また、コードを短くするために、不要なコードを可能な限り削除しました。

お時間をいただきありがとうございました!

〜セント

SSCCE:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

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

public class Main implements Runnable
{
private static final long serialVersionUID = 1L;
private static final int WIDTH = 800;
private static final int HEIGHT = 600;
private static final String NAME = "";
private JFrame frame;
private JTextPane textPane = new JTextPane();
private int keysPressed = -1; /* Keys pressed */
private ArrayList<Integer> keyCode = new ArrayList<Integer>(); /* List of our keyCodes */

public void run()
{
    frame = new JFrame(NAME);
    frame.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    frame.setMinimumSize(new Dimension(WIDTH, HEIGHT));
    frame.setMaximumSize(new Dimension(WIDTH, HEIGHT));
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 
    frame.add(textPane, BorderLayout.CENTER);
    textPane.setPreferredSize(new Dimension(WIDTH, HEIGHT));
    textPane.setEditable(true);
    textPane.addKeyListener(new KeyListener(){
                @Override 
                public void keyPressed(KeyEvent e) 
                {
                     int previousPos; /* Previous position of the caret */
                     int length; /* Length of our grabbed string */

                     int currentPos; /* Current position of the caret */

                     String text; /* The entire text of the JTextPane */
                     String subText; /* Our sub-string-text we're using */
                     String subTextP; /* Our sub-string-text plus one character*/

                     boolean first = true; /* Be default, it's the first letter */

                     StyledDocument doc = textPane.getStyledDocument(); 
                     SimpleAttributeSet sas = new SimpleAttributeSet(); /* So we can set bold, and such */

                     keyCode.add(new Integer(e.getKeyCode())); /* The key pressed */
                     keysPressed++;
                     currentPos = textPane.getCaretPosition(); /* The current position of the caret */

                     text = textPane.getText(); /* Grabbing the text on the text pane */
                     previousPos = text.lastIndexOf(" ", currentPos); /* Getting the last position of a space */
                     if(previousPos <= 0) /* If the position if before or equal to 0 */ 
                     {
                         previousPos = 0; /* Then the position is 0 */
                     }
                     length = currentPos - previousPos; /* The length of the string we're messing with, is between the two positions */
                     subText = text.substring(previousPos, currentPos); /* Grabbing the string between our two positions */
                     if(first) /* If this is the first letter, or insert */
                     {
                         if(keyCode.contains(KeyEvent.VK_SHIFT))
                         {
                             first = true;
                             subTextP = text.substring(0, 0); /* Then we want to grab it, at 0, 0 */
                         }
                         else
                         {
                             subTextP = text.substring(0, 0); /* Then we want to grab it, at 0, 0 */
                             first = false; /* it's no longer the first */
                         }
                     }
                     else /* If it isn't */
                     {
                         subTextP = text.substring(previousPos + 1, currentPos); /* Then we want to grab the usual */
                     }
                     subText = subText.replaceAll("[\\n\\t\\r]", ""); /* Getting rid of all the tabs and newlines */
                     subTextP = subTextP.replaceAll("[\\n\\t\\r]", ""); /*Getting rid of all the tabs and new lines */

                     if(keyCode.contains(KeyEvent.VK_3)) 
                     {
                         if(keyCode.contains(KeyEvent.VK_SHIFT)) 
                         {
                             System.out.println("Number sign hit!");                                 
                             StyleConstants.setForeground(sas, Color.GREEN); /* Anything following a number sign will be green */
                             doc.setCharacterAttributes(previousPos, length, sas, false);  /* Turning it green */
                         }
                     }
                     if(keyCode.contains(KeyEvent.VK_SPACE)) /* If a space has been hit! */
                     {
                         /* This is were we'll do all text coloring and such */
                         if(subText.equals(" if") || subText.equals("if") || subTextP.equals("if")) /* All things to be bolded */
                         {
                             StyleConstants.setForeground(sas, Color.GRAY); /* All of these statements will be gray... */
                             StyleConstants.setBold(sas, true); /* ... and bold */
                             doc.setCharacterAttributes(previousPos, length, sas, false); /* Making them so! */
                             StyleConstants.setBold(sas, false); /* We don't want these attributes to remain... */
                             StyleConstants.setForeground(sas, Color.black); /* ... So we're removing them. */
                         }
                     }
                }

                public void keyReleased(KeyEvent e) 
                {
                    for(int i = keysPressed; i >= 0; i--) /* For loop to remove all keyPresses from our list */
                    {
                        keyCode.remove(i); /* Removing the specified keyPress */
                    }
                    keysPressed = -1; /* Because the first index is 0, and we want to add one to keysPressed, we need to start below 0 */
                }

                @Override
                public void keyTyped(KeyEvent arg0) {
                }
    });
    frame.pack(); 
    frame.setVisible(true);
}

public void start()
{
    new Thread(this).start();
}

public final static void main(String args[])
{
    new Main().start();
}

}

編集:

問題を再現するには、上記のコードを実行します。textPane で、「if」という単語 (引用符なし) を入力し、スペースバーを押します。単語は太字になり、灰色になります。次に、その後に「#」(引用符なし) (間にスペース) を入力して、スペースまたはその他のキーを押します。何も起こりません。ただし、システムは「Number sign hit!」を出力する必要があります。「#」を入力すると、コードは実際にはまだ到達可能であることを意味します。また、「if」と同じコードを「#」にも (色の変更以外は)使用していることにも注意してください。問題をもう少し理解するのに役立つことを願っています。

4

1 に答える 1

2

まず第一に、KeyListenerここで使用するのは正しくありません。

KeyBindingsまたはを代わりに使用します(DocumentListenerまたは、ドキュメントを独自の拡張子に置き換えて、メソッドをオーバーライドします)。スペース入力後だけでなく、誰かがキーワードの途中から文字を削除したときにも、ハイライトを変更する必要があります。DocumentFilterinsertString()remove()

SSCCEを投稿して、実際の問題を示し、実際の動作を再現し、望ましい動作を説明する手順を提供してください。

于 2012-12-04T06:14:30.743 に答える