[RISOLTO] Cercare testo in una textarea ed evidenziarlo

di il
21 risposte

21 Risposte - Pagina 2

  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    Non funziona, ci rinuncio, grazie per i consigli.
  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    patel ha scritto:


    Non funziona, ci rinuncio, grazie per i consigli.
    Non funziona cosa? Puoi/vuoi descrivere i dubbi o problemi?
    Ho dato tutte le indicazioni, compreso il fatto che jTextField1.getText() non lo puoi fare nel costruttore perché non ha senso.
  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    Ormai sono confuso, ho provato tutte le tue indicazioni, addirittura ho messo direttamente il testo da cercare al posto di jTextField1.getText(), ma non mi trova e seleziona niente. Torno alla mia precedente soluzione, meno elegante ma che funziona.
    Sono un principiante, spesso non capisco certe tue indicazioni tipo "(che non è una definizione di variabile, ma un assegnamento alla variabile di istanza)", programmo per diletto mettendo insieme quello che trovo in rete.
  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    patel ha scritto:


    Ormai sono confuso, ho provato tutte le tue indicazioni, addirittura ho messo direttamente il testo da cercare al posto di jTextField1.getText(), ma non mi trova e seleziona niente.
    Capisco, pazienza, mi spiace. Se ti può essere utile, di oggi o domani posso scriverti un esempio completo, con textfield, ecc... Non ci metto molto a scriverlo!
  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    Non voglio farti perdere tempo inutilmente, allego il mio codice già funzionante, da modificare applicando la tua classe
    package prova5;
    
    import java.awt.Color;
    import javax.swing.JOptionPane;
    import javax.swing.JTextArea;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DefaultHighlighter;
    import javax.swing.text.Highlighter;
    
    /**
     *
     * @author User
     */
    public class PROVA5  extends javax.swing.JFrame {
        int inizio = 0;
    
        public PROVA5() {
            initComponents();
             String msg = "Ciao, questo è un test al fine di testare il Highlighter\n";
            jTextArea1.setText(msg + msg + msg);
            jTextField1.setText("fine");
    
        }
       
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextArea1 = new javax.swing.JTextArea();
            jTextField1 = new javax.swing.JTextField();
            jButton5 = new javax.swing.JButton();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            jTextArea1.setColumns(20);
            jTextArea1.setFont(new java.awt.Font("Arial", 0, 18)); // NOI18N
            jTextArea1.setRows(5);
            jScrollPane1.setViewportView(jTextArea1);
    
            jTextField1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
    
            jButton5.setText("CERCA");
            jButton5.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton5ActionPerformed(evt);
                }
            });
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jScrollPane1)
                            .addContainerGap())
                        .addGroup(layout.createSequentialGroup()
                            .addGap(198, 198, 198)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 304, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(29, 29, 29)
                            .addComponent(jButton5)
                            .addGap(33, 411, Short.MAX_VALUE))))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton5))
                    .addGap(18, 18, 18)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 435, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap())
            );
    
            pack();
        }// </editor-fold>                        
    
        private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // --------CERCA ----------------
          String inputValue = jTextField1.getText();
    //      System.out.println(inizio);
            inizio = jTextArea1.getText().indexOf(inputValue, inizio);
            int lunghezza = inputValue.length();
            if (inizio == -1) {
                JOptionPane.showMessageDialog(null, "NON TROVATO");
            } else {
                jTextArea1.setSelectionStart(inizio);
                jTextArea1.setSelectionEnd(lunghezza + inizio);
                highlight(jTextArea1, inputValue);
            }
        }                                        
    
            public void highlight(JTextArea textComp, String pattern) {
            removeHighlights(textComp);
            try {
                Highlighter hilite = textComp.getHighlighter();
                hilite.addHighlight(inizio, inizio+pattern.length(), textPainter);
                inizio += pattern.length();
            } catch (BadLocationException e) {
            }
        }
    public void removeHighlights(JTextArea 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]);
    
    }}} 
    private Highlighter.HighlightPainter textPainter = new TextPainter(Color.GREEN);
    
    class TextPainter extends DefaultHighlighter.DefaultHighlightPainter {
    
        public TextPainter(Color color) {
        super(color);
        }
    }
        public static void main(String args[]) {
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(RubriFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(RubriFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(RubriFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(RubriFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new PROVA5().setVisible(true);
                }
            });
        }
    
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton5;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextArea jTextArea1;
        private javax.swing.JTextField jTextField1;
        // End of variables declaration                   
    }
    
  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    Ciao andbin, ci sono ritornato sopra, ho preso ad esempio il codice da te allegato e funziona a meraviglia, grazie della tua pazienza.
  • Re: [RISOLTO] Cercare testo in una textarea ed evidenziarlo

    Allego codice di esempio con la ricerca durante la digitazione su texfield
    package TextAreaFind;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DefaultHighlighter;
    import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
    import javax.swing.text.Highlighter;
    import javax.swing.text.JTextComponent;
    
    public class TextAreafind extends JFrame {
    //    private static final long serialVersionUID = 1L;
        private JTextArea textArea;
        private ProgressiveHighlighter progrHighlighter;
        private JButton searchButton;
        private JTextField TextField;
        String iValue = "";
        int inizio = 0;
    
        public TextAreafind() {
            super("Prova");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(400, 250);
            setLocationRelativeTo(null);
    
            String msg = "Ciao, questo è un test per testare questa classe Highlighter\n";
            textArea = new JTextArea(msg + msg + msg + msg + msg+ msg + msg+ msg + msg );
            searchButton = new JButton("CERCA");
            TextField = new JTextField(20);
            progrHighlighter = new ProgressiveHighlighter(textArea);
            progrHighlighter.setPainter(new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN));
            progrHighlighter.setSearchText(TextField.getText()); 
    
            
            TextField.addKeyListener(new KeyListener() { 
            @Override 
            public void keyTyped(KeyEvent e) { 
                iValue = TextField.getText();
            } 
            @Override 
            public void keyPressed(KeyEvent e) {}
            @Override 
            public void keyReleased(KeyEvent e) { 
                iValue = TextField.getText();
                Cerca(iValue);
            } 
        }); 
            
            searchButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Cerca(TextField.getText());
    //                progrHighlighter.nextHighlight();
                }
            });
    
            add(new JScrollPane(textArea), BorderLayout.NORTH);
            add(searchButton, BorderLayout.EAST);
                    add(TextField, BorderLayout.WEST);
        }
        private void Cerca(String inputValue) {                                         
          progrHighlighter.setSearchText(inputValue); 
          progrHighlighter.nextHighlight();
    
        }     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TextAreafind().setVisible(true);
                }
            });
        }
    }
    
    
    class ProgressiveHighlighter {
        private final JTextComponent textComponent;
        private Highlighter.HighlightPainter painter;
        private String searchText;
        private Highlighter.Highlight currentHighlight;
    
        public ProgressiveHighlighter(JTextComponent textComponent) {
            this.textComponent = textComponent;
        }
    
        public void setPainter(Highlighter.HighlightPainter painter) {
            this.painter = painter;
        }
    
        public void setSearchText(String searchText) {
            this.searchText = searchText;
        }
    
        // altri getter/setter se necessari
    
        public void nextHighlight() {
            String text = textComponent.getText().toLowerCase();
            int fromIndex = currentHighlight == null ? 0 : currentHighlight.getEndOffset() + 1;
    
            int resultIndex = text.indexOf(searchText, fromIndex);
    
            if (resultIndex < 0 && fromIndex > 0) {
                resultIndex = text.indexOf(searchText, 0);
            }
    
            if (resultIndex >= 0) {
                Highlighter highlighter = textComponent.getHighlighter();
    
                if (currentHighlight != null) {
                    highlighter.removeHighlight(currentHighlight);
                }
    
                try {
                    currentHighlight = (Highlighter.Highlight) highlighter.addHighlight(resultIndex, resultIndex+searchText.length(), painter);
                    textComponent.setCaretPosition(resultIndex);
                } catch (BadLocationException e) {
                    // TODO
                }
            }
        }
    }
Devi accedere o registrarti per scrivere nel forum
21 risposte