Goto specificato numero di linea utilizzando JTextPane

io voglio mettere il cursore a utente dato numero di linea. per questo io avevo scritto codice. ma, quando io entro una linea numero 2 il cursore fu messo in dopo primo carattere non in inizio del secondo line.Please aiutarmi... Grazie. ecco il codice:

public class GoToAction extends javax.swing.JFrame {

    int i=0;
    JTextPane textPane;
    int lineCount;

    public GoToAction() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        tabbedPane = new javax.swing.JTabbedPane();
        jMenuBar1 = new javax.swing.JMenuBar();
        file = new javax.swing.JMenu();
        create = new javax.swing.JMenuItem();
        goTo = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        file.setText("File");

        create.setText("Create");
        create.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createActionPerformed(evt);
            }
        });
        file.add(create);

        goTo.setText("GoTo");
        goTo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                goToActionPerformed(evt);
            }
        });
        file.add(goTo);

        jMenuBar1.add(file);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void createActionPerformed(java.awt.event.ActionEvent evt) {                                       
        final JInternalFrame internalFrame = new JInternalFrame("");
        i++;
        internalFrame.setName("Document"+i);
        internalFrame.setClosable(true);
        internalFrame.setAutoscrolls(true);
        textPane=new JTextPane();
        textPane.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
        internalFrame.add(textPane);
        tabbedPane.add(internalFrame);
        internalFrame.setSize(internalFrame.getMaximumSize());
        internalFrame.pack();
        internalFrame.setVisible(true);
    }                                      

    private void goToActionPerformed(java.awt.event.ActionEvent evt) {                                     
           do {
          try {
          String str = (String)JOptionPane.showInputDialog(this,"Line number:\t","Goto line",JOptionPane.PLAIN_MESSAGE,null,null,null);
          if( str == null ) {
          break;
          }
          int lineNumber = Integer.parseInt(str);
          lineCount=getLineCount();
          if ( lineNumber > lineCount ) {
          JOptionPane.showMessageDialog(this,"Line number out of range","EPAD Goto line",JOptionPane.ERROR_MESSAGE);
          continue;
          }   
          for ( int i = 0 ; i < lineCount; i++ ){
          if ( i+1 == lineNumber ) {
              textPane.setCaretPosition(i);
                      return;
          }
          }
          } catch ( Exception e ) {
          }
         } while ( true );
    }                                    
    public int getLineCount(){ 
        lineCount=0;
        Scanner sc=new Scanner(textPane.getText());
        while(sc.hasNextLine()){
            String line = sc.nextLine(); 
            lineCount++;
       }
        return lineCount;
    }
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        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(GoToAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(GoToAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(GoToAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(GoToAction.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GoToAction().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JMenuItem create;
    private javax.swing.JMenu file;
    private javax.swing.JMenuItem goTo;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JTabbedPane tabbedPane;
    // End of variables declaration                   
}

En title : GoTo specified line number using JTextPane

6 Comments:

  1. ho aggiunto un nuovo metodo public int setcursor(int newlineno) e modificato il codice. in questo metodo sto semplicemente calcolando la posizione del cursore prevista.

    eseguire il seguente codice;)

    import java.awt.Rectangle;
    import java.util.Scanner;
    
    import javax.swing.JInternalFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTextPane;
    
    public class GoToAction extends javax.swing.JFrame {
    
        int i = 0;
        JTextPane textPane;
        int lineCount;
    
        public GoToAction() {
            initComponents();
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
            tabbedPane = new javax.swing.JTabbedPane();
            jMenuBar1 = new javax.swing.JMenuBar();
            file = new javax.swing.JMenu();
            create = new javax.swing.JMenuItem();
            goTo = new javax.swing.JMenuItem();
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            file.setText("File");
            create.setText("Create");
            create.addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    createActionPerformed(evt);
                }
            });
            file.add(create);
            goTo.setText("GoTo");
            goTo.addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    goToActionPerformed(evt);
                }
            });
            file.add(goTo);
            jMenuBar1.add(file);
            setJMenuBar(jMenuBar1);
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, 
                    javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE));
            layout.setVerticalGroup(
                    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tabbedPane, javax.swing.GroupLayout.Alignment.TRAILING, 
                    javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE));
            pack();
        }// </editor-fold>                        
    
        private void createActionPerformed(java.awt.event.ActionEvent evt) {
            final JInternalFrame internalFrame = new JInternalFrame("");
            i++;
            internalFrame.setName("Document" + i);
            internalFrame.setClosable(true);
            internalFrame.setAutoscrolls(true);
            textPane = new JTextPane();
            textPane.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
            internalFrame.add(textPane);
            tabbedPane.add(internalFrame);
            internalFrame.setSize(internalFrame.getMaximumSize());
            internalFrame.pack();
            internalFrame.setVisible(true);
        }
    
        private void goToActionPerformed(java.awt.event.ActionEvent evt) {
            do {
                try {
                    String str = (String) JOptionPane.showInputDialog(this, 
                            "Line number:\t", "Goto line", 
                            JOptionPane.PLAIN_MESSAGE, null, null, null);
                    if (str == null) {
                        break;
                    }
                    int lineNumber = Integer.parseInt(str);
                    lineCount = getLineCount();
                    System.out.println(lineCount);
                    if (lineNumber > lineCount) {
                        JOptionPane.showMessageDialog(this, 
                                "Line number out of range", "EPAD Goto line", 
                                JOptionPane.ERROR_MESSAGE);
                        continue;
                    }
                    //  for ( int i = 0 ; i < lineCount; i++ ){
                    //  if ( i+1 == lineNumber ) {
                    //Rectangle rectangle = textPane.modelToView(textPane.getCaretPosition());
                    textPane.setCaretPosition(0);
                    System.out.println(setcursor(lineNumber));
                    textPane.setCaretPosition(setcursor(lineNumber));
                    return;
                    //  }
                    //  }
                } catch (Exception e) {
                }
            } while (true);
        }
    
        public int getLineCount() {
            lineCount = 0;
            Scanner sc = new Scanner(textPane.getText());
            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                lineCount++;
            }
            return lineCount;
        }
    
        public int setcursor(int newlineno) {
            int pos = 0;
            int i = 0;
            String line = "";
            Scanner sc = new Scanner(textPane.getText());
            while (sc.hasNextLine()) {
                line = sc.nextLine();
                i++;
                if (newlineno > i) {
                    pos = pos + line.length() + 1;
                }
            }
            return pos;
        }
    
        public static void main(String args[]) {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            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(GoToAction.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(GoToAction.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(GoToAction.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(GoToAction.class.getName())
                        .log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>
    
            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new GoToAction().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JMenuItem create;
        private javax.swing.JMenu file;
        private javax.swing.JMenuItem goTo;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JTabbedPane tabbedPane;
        // End of variables declaration  
    }
    
    1. @user3709795, Non è la soluzione più efficace in quanto non sfrutta la struttura degli Elementi del Documento. per prima cosa il metodo gettext deve iterare attraverso la struttura degli Elementi del Documento per creare una Stringa. poi è necessario analizzare la stringa e romperla in singole righe di testo. diventa più inefficiente man mano che vengono aggiunte altre linee al documento.
    1. @camickr So che la mia soluzione non è molto efficiente, ma non ho mai usato Utilità di testo suggerito da voi. buona cosa da imparare. :) + 1 alla tua risposta per mostrarla.
  2. scopri il metodo gotoStartOfLine(...) in Text Utilities per una soluzione più efficiente che sfrutta la struttura Element del Document utilizzato dal componente testo.

More similar articles:

  • metodo che restituisce il numero di linea per una data posizione JTextPane?
  • JTextPane append registri istantaneamente linea per linea
  • disattivare i collegamenti ipertestuali in JTextPane
  • JTextPane interruzione di linea
  • modo corretto creare Class, JTree, DefaultTreeCellRenderer utilizzando JTextPane
  • syntax evidenziando in JTextPane utilizzando SwingWorker
  • JTextPane, StyledDocument: impostazione della posizione caret dall'indice di input raw
  • JTextPane rimozione prima linea
  • JTextPane crea una nuova linea
  • JTextPane avvolgere e scartare le parole lunghe con fuori spazio usando JButton
  • avvolgimento linea JTextPane
  • posizionare l'immagine in un JTextPane (come usare setBounds per posizionare JPanel in un Jframe)
  • JTextPane non va su una nuova linea?
  • swing - La mia classe estende JTextPane e chiamando prima il mio append () e poi super.setText () aggiungere ulteriore interruzione di linea
  • fermare un JTextPane dalla ricezione di nuovi feed di linea
  • risoluzione problemi icona JTextPane Insert
  • come fare chat a colori tra client e server utilizzando JTextPane?
  • avvolgere il testo in una JTextPane quando la larghezza del riquadro supera un valore specificato
  • fa serializzare il Documento di JTextPane, serializza gli ascoltatori di JTextPane?
  • JTextPane con HTML - l'immagine locale non verrà caricata
  • testo disegnato non correttamente salvato da JTextPane
  • come raggiungere/attivare il bersaglio di un collegamento ipertestuale all'interno di un JEditorPane/JTextPane programmaticamente
  • JTextPane - impacco di parole dinamico
  • come LineWrap un testo in JTextPane con GridBagLayout
  • JTextPane inserimento di grande problema di testo
  • rimuovere sfondo bianco di JTextPane senza setOpaque () su un Jframe traslucido
  • JTextPane all'interno di un GridBagLayout non si comportano nel modo desiderato
  • testo di stile in una JTextArea o JTextPane
  • come modificare facilmente lo stile del testo selezionato in una JTextPane?
  • come allineare il testo selezionato in una JTextPane?