[RISOLTO] Cercare testo in una textarea ed evidenziarlo

di patel il
21 risposte

21 Risposte - Pagina 2

  • Non funziona, ci rinuncio, grazie per i consigli.
  • 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.
  • 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.
  • 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!
  • 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                   
    }
    
  • Ciao andbin, ci sono ritornato sopra, ho preso ad esempio il codice da te allegato e funziona a meraviglia, grazie della tua pazienza.
  • 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