0

textPaneで文字列を検索すると、StyledDocを使用してtextPaneからテキストを取得するだけでなく、検索されて返される行番号ごとに追加のインデックスが取得されるという奇妙な問題があります(少なくともそのように見えます)。同じペインから同じテキストを取得します。1つはプレーンテキストからのもので、もう1つはスタイル付きドキュメントからのものです。私はここで何かが欠けていますか?使用している2つのバージョン間の変更点をできるだけ多くリストしてみます。

プレーンテキストバージョン:

public int displayXMLFile(String path, int target){
    InputStreamReader inputStream;
    FileInputStream fileStream;
    BufferedReader buffReader;

    if(target == 1){

        try{                
            File file = new File(path);
            fileStream = new FileInputStream(file);
            inputStream = new InputStreamReader(fileStream,"UTF-8");
            buffReader = new BufferedReader(inputStream);
            StringBuffer content = new StringBuffer("");
            String line = "";
            while((line = buffReader.readLine())!=null){
                content.append(line+"\n");
            }
            buffReader.close();
            xhw.txtDisplay_1.setText(content.toString());
        }
        catch(Exception e){
            e.printStackTrace();
            return -1;
        }
    }
}

スタイル付きドキュメントの詩(スタイルが適用されていない)

    protected void openFile(String path, StyledDocument sDoc, int target) 
                throws BadLocationException {

    FileInputStream fileStream;
    String file;
    if(target == 1){
        file = "Openning First File";
    } else {
        file = "Openning Second File";
    }


    try {
        fileStream = new FileInputStream(path);

        // Get the object of DataInputStream
        //DataInputStream in = new DataInputStream(fileStream);

        ProgressMonitorInputStream in = new ProgressMonitorInputStream(
                xw.getContentPane(), file, fileStream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        //Read File Line By Line
        while ((strLine = br.readLine()) != null)   {                   
            sDoc.insertString(sDoc.getLength(), strLine + "\n", sDoc.getStyle("regular"));
        xw.updateProgress(target);
        } 

        //Close the input stream
        in.close();
    } catch (Exception e){//Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }

これが私が検索する方法です:

    public int searchText(int sPos, int target) throws BadLocationException{

    String search = xhw.textSearch.getText();
    String contents;
    JTextPane searchPane;

    if(target == 1){
        searchPane = xhw.txtDisplay_1;              
    } else {
        searchPane = xhw.txtDisplay_2;
    }

    if(xhw.textSearch.getText().isEmpty()){
        xhw.displayDialog("Nothing to search for");
        highlight(searchPane, null, 0,0);
    } else {


        contents = searchPane.getText();

        // Search for the desired string starting at cursor position
        int newPos = contents.indexOf( search, sPos );

        // cycle cursor to beginning of doc window
        if (newPos == -1 && sPos > 0){
            sPos = 0;
            newPos = contents.indexOf( search, sPos );
        } 

        if ( newPos >= 0 ) {
            // Select occurrence if found

            highlight(searchPane, contents, newPos, target);

            sPos = newPos + search.length()+1;
        } else {
            xhw.displayDialog("\"" + search + "\"" + " was not found in File " + target);
        }
    } 
    return sPos;
}

サンプルファイル:

<?xml version="1.0" encoding="UTF-8"?>
<AlternateDepartureRoutes>
  <AlternateDepartureRoute>
    <AdrName>BOIRR</AdrName>
    <AdrRouteAlpha>..BROPH..</AdrRouteAlpha>
    <TransitionFix>
      <FixName>BROPH</FixName>
    </TransitionFix>
  </AlternateDepartureRoute>
  <AlternateDepartureRoute>
</AlternateDepartureRoutes>

そして私の蛍光ペン:

    public void highlight(JTextPane tPane, String text, int position, int target) throws BadLocationException {
    Highlighter highlighter =  new DefaultHighlighter();
    Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.LIGHT_GRAY);
    tPane.setHighlighter(highlighter);

    String searchText = xhw.textSearch.getText();
    String document = tPane.getText();
    int startOfSString = document.indexOf(searchText,position);

    if(startOfSString >= 0){
        int endOfSString = startOfSString + searchText.length();
        highlighter.addHighlight(startOfSString, endOfSString, painter);
        tPane.setCaretPosition(endOfSString);
        int caretPos = tPane.getCaretPosition();
        javax.swing.text.Element root = tPane.getDocument().getDefaultRootElement();
        int lineNum = root.getElementIndex(caretPos) +1;
        if (target == 1){
            xhw.txtLineNum1.setText(Integer.toString(lineNum));
        } else if (target == 2){
            xhw.txtLineNum2.setText(Integer.toString(lineNum));
        } else {
            xhw.txtLineNum1.setText(null);
            xhw.txtLineNum2.setText(null);
        }

    } else {
        highlighter.removeAllHighlights();
    }

}

indexof()を使用してAltを検索すると、プレーンテキスト(返される内容)が40になり、スタイル付きドキュメントを使用して検索すると41になります。そして、Altが表示される追加の行ごとに、追加のインデックスを取得します(indexof()呼び出しは、3行目で必要とされるよりも2つ多く返されます)。これは、検出された追加の行ごとに発生します。明らかな何かが欠けていますか?(これをより小さな単一のクラスにプッシュして確認しやすくする必要がある場合は、後で時間があればこれを行うことができます)。

前もって感謝します...

4

2 に答える 2

1

Windowsを使用している場合、TextComponentテキスト(searchPane.getText())にはキャリッジリターン+改行文字(\ r \ n)を含めることができますが、TextComponentのスタイル付きドキュメント(sSearchPane.getText(0、sSearchPane.getLength())) )には改行文字(\ n)のみが含まれます。そのため、その時点での改行の数だけ、newPosは常にnewPosSよりも大きくなります。これを修正するには、検索機能で次を変更できます。

contents = searchPane.getText();

に:

contents = searchPane.getText().replaceAll("\r\n","\n");

このようにして、スタイル付きドキュメントが使用しているのと同じインデックスで検索が行われます。

于 2012-08-21T19:40:22.963 に答える
0

OK私は解決策を見つけました(基本的に)。私は、同じテキストコンポーネントから2つの異なる方法でテキストを取得しているという観点からこれにアプローチしました...

    String search = xw.textSearch.getText();
    String contents;
    String contentsS;
    JTextPane searchPane;
    StyledDocument sSearchPane;

    searchPane = xw.txtDisplay_left;
    sSearchPane = xw.txtDisplay_left.getStyledDocument();


    contents = searchPane.getText();
    contentsS = sSearchPane.getText(0, sSearchPane.getLength());

    // Search for the desired string starting at cursor position
    int newPos = contents.indexOf( search, sPos );
    int newPosS = contentsS.indexOf(search, sPos);

したがって、2つの変数「newPos」と「newPosS」を比較すると、newPosは、検索文字列が見つかった各行について、newPosSよりも1つ多く戻りました。したがって、サンプルファイルを見て「Alt」を検索すると、最初のインスタンスは2行目にあります。「newPos」は41を返し、「newPosSは40を返します(正しいテキストを強調表示します)。次の出現(行にあります) 3)「newPos」は71を返し、「newPosS」は69を返します。ご覧のとおり、新しい行ごとに、出現が始まる行番号だけカウントが増加します。新しい行ごとに追加の文字が追加されていると思われます。 StyledDocに存在しないtextPaneから。

合理的な説明があると思いますが、現時点では説明がありません。

于 2012-07-15T16:47:48.510 に答える