# Find & Replace Dialog für JTextArea



## burton007 (27. Apr 2006)

hallo liebe java-programmierer!

bin schon den ganzen tag kräftig am rumsuchen, finde aber keine lösung im net, 
hoffe ihr könnt mir etwas auf die sprünge helfen.

also, ich habe ein JFrame mit einer JTextArea und in dieser werden diverse listen aufgelistet.
nun möchte ich gerne die typische STRG+F - funktion einbinden. also einfach diese TextArea
nach bestimmten Strings durchsuchen. wäre nämlich praktisch, inkl. vor-rückwärtssuchen, 
ersetzen usw. 
gibt es da fertige dialoge die man einbinden kann? wenn nicht, wär ich um ratschläge aller 
art sehr dankbar. 

vielen dank schon mal im voraus. 

mfg burton007


----------



## André Uhres (30. Apr 2006)

Suchen kannst du mit indexOf und lastIndexOf.
Beispiel:

```
public void find() {
        messageLabel.setText("   ") ;
        upperPanel.setBackground(MESSAGE_DEFAULT_COLOR) ;
        if(!isFindNext && !isFindPrevious){
            isHighlighted=false;
            String selectedText = textComp.getSelectedText();
            if(selectedText!=null && !selectedText.equals("")){
                pattern=selectedText;
            }
            if(!isFindSelection){
                String input = JOptionPane.showInputDialog(
                        "Find what:", pattern);
                if(input==null){
                    input="";
                }
                pattern=input;
            }
        }
        doFind();
    }
    private int doFind(){
        textComp.requestFocus();
        currentCaretPosition = textComp.getCaretPosition();
        text = textComp.getText();
        if(!pattern.equals("")){
            int pos=0;
            if(isFindPrevious){
                pos = text.toLowerCase().lastIndexOf(pattern.toLowerCase(), currentCaretPosition-pattern.length()-1);
            }else{
                pos = text.toLowerCase().indexOf(pattern.toLowerCase(), currentCaretPosition);
            }
            if(pos < 0){
                messageLabel.setText("Find has Finished") ;
                upperPanel.setBackground(Color.blue) ;
                messageLabel.setForeground(Color.white);
                textComp.requestFocus();
                return 2;//find has finished
            }
            if(pos>-1){
                sp.getHorizontalScrollBar().setValue(0);
                textComp.setCaretPosition(pos+pattern.length());
                if(!isHighlighted){
                    isHighlighted=true;
                    highlight(textComp, pattern);
                }
                return 3;//found
            }
        }else{
            removeHighlights(textComp);
            return 1;//no pattern
        }
        return 4;//not found
    }
    // Creates highlights around all occurrences of pattern in textComp
    public void highlight(JTextComponent textComp, String pattern) {
        // First remove all old highlights
        removeHighlights(textComp);
        
        try {
            Highlighter hilite = textComp.getHighlighter();
            Document doc = textComp.getDocument();
            String text = doc.getText(0, doc.getLength());
            int pos = 0;
            // Search for pattern
            while ((pos = text.toLowerCase().indexOf(pattern.toLowerCase(), pos)) >= 0) {
                // Add highlight around pattern using private painter
                currentHilite = hilite.addHighlight(pos, pos+pattern.length(), textPainter);
                isHighlightPresent=true;
                pos += pattern.length();
            }
        } catch (BadLocationException e) {
        }
    }
    Object currentHilite;
    // Removes only our private highlights
    public void removeHighlights(JTextComponent textComp) {
        Highlighter hilite = textComp.getHighlighter();
        Highlighter.Highlight[] hilites = hilite.getHighlights();
        
        for (int i=0; i<hilites.length; i++) {
            if (hilites[i].getPainter() instanceof TextPainter) {
                hilite.removeHighlight(hilites[i]);
            }
        }
    }
    // An instance of the private subclass of the default highlight painter
    Highlighter.HighlightPainter textPainter = new TextPainter(Color.yellow);
    
    // A private subclass of the default highlight painter
    class TextPainter extends DefaultHighlighter.DefaultHighlightPainter {
        public TextPainter(Color color) {
            super(color);
        }
    }
```


----------



## burton007 (3. Mai 2006)

dieser ansatz bringt mir schon einiges, es funktioniert auch einwandfrei.
habe den source code auf mein programm umgeändert. 
das einzige was mir dabei auffällt und ich auch noch beseitigen möchte ist
folgendes: nach einer suche wird die maus wenn ich die vertikale scrollbar
berühre als sanduhr dargestellt. habe bis jetzt aber nicht herausgefunden
warum. liegt es an meiner änderrung oder besteht das problem generell??

nochmals vielen dank für den geposteten source code!!  

lg burton007


----------



## André Uhres (3. Mai 2006)

burton007 hat gesagt.:
			
		

> ...nach einer suche wird die maus wenn ich die vertikale scrollbar
> berühre als sanduhr dargestellt...


Das kommt hiervon: "frame.getContentPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));"
Kannst du einfach rausnehmen.


----------



## burton007 (3. Mai 2006)

...jetzt funktioniert alles einwandfrei... 

vielen dank :toll:


----------

