0

I want to display the Line numbers using checkbox menu Item.I am almost completed this task.But,problem here is Display line numbers whenever press the enter key only rather than check the checkbox menu item.I want to display the line numbers when click the checkbox item itself.Please give me some suggestions...

Here is code:

public class ViewLineNumbs extends javax.swing.JFrame {
int i=0;
JTextArea tx,lines;
JScrollPane scrollpane;
public ViewLineNumbs() {
    initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    tp = new javax.swing.JTabbedPane();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    Create = new javax.swing.JMenuItem();
    ViewLineNumbers = new javax.swing.JCheckBoxMenuItem();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jMenu1.setText("File");

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

    ViewLineNumbers.setSelected(true);
    ViewLineNumbers.setText("ViewLineNumbers");
    ViewLineNumbers.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            ViewLineNumbersActionPerformed(evt);
        }
    });
    jMenu1.add(ViewLineNumbers);

    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tp, 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);
    tx=new JTextArea();
    tx.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
    scrollpane=new JScrollPane(tx);
    internalFrame.add(scrollpane);
    tp.add(internalFrame);
    internalFrame.setSize(internalFrame.getMaximumSize());
    internalFrame.pack();
    internalFrame.setVisible(true);
}                                      

private void ViewLineNumbersActionPerformed(java.awt.event.ActionEvent evt) {                                                

        ViewLineNumbers.addItemListener(new ItemListener() {
               @Override
               public void itemStateChanged(ItemEvent ie) {
                  if(ViewLineNumbers.getState()){
                    lines = new JTextArea("");
                    lines.setBackground(Color.LIGHT_GRAY);
            lines.setEditable(false);
                    lines.setSize(10,10);
                    lines.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
                    tx.getDocument().addDocumentListener(new DocumentListener(){
        public String getText(){
            int caretPosition = tx.getDocument().getLength();
            Element root = tx.getDocument().getDefaultRootElement();
            String text = "1" + System.getProperty("line.separator");
            for(int i = 2; i < root.getElementIndex( caretPosition ) + 1; i++){
                text += i + System.getProperty("line.separator");
            }
            return text;
         }
        @Override
        public void changedUpdate(DocumentEvent de) {
            lines.setText(getText());
        }
        @Override
        public void insertUpdate(DocumentEvent de) {
            lines.setText(getText());
        }

        @Override
        public void removeUpdate(DocumentEvent de) {
            lines.setText(getText());
        }
    });

                   scrollpane.getViewport().add(tx);
                   scrollpane.setRowHeaderView(lines); 
                   }
                   else{
                       scrollpane.setRowHeaderView(null);

                   }
               }
          });
}                                               

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(ViewLineNumbs.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(ViewLineNumbs.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(ViewLineNumbs.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(ViewLineNumbs.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 ViewLineNumbs().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JMenuItem Create;
private javax.swing.JCheckBoxMenuItem ViewLineNumbers;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JTabbedPane tp;
// End of variables declaration                   

}

  • Consider taking a look at [this example](http://stackoverflow.com/questions/21766588/make-jscrollpane-control-multiple-components/21767752#21767752) – MadProgrammer May 29 '14 at 11:29

4 Answers4

0

Try something like this

private void CreateActionPerformed(java.awt.event.ActionEvent evt) {       
  AbstractButton btn = (AbstractButton) evt.getSource();
  if (btn.isSelected())                                
    // your stuff
  }
}
Sergiy Medvynskyy
  • 11,160
  • 1
  • 32
  • 48
  • Thank you.But the solution is also not working as expected (result is same as before).please look at the code of viewLineNumbersActionPerformed().I think some modification need inside the if block.Plese give me some suggestions... – user3675761 May 29 '14 at 11:22
0

I think ,you have to use JCheckBoxMenuItem addItemListener here,if i understand correctly. look into the code.

ViewLineNumbers.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent e) {
        System.out.println("Checked? " + check.isSelected());

//do your stuff here....
      }
    });

i hope,it will solve your problem.

user3662273
  • 544
  • 4
  • 10
0

You have to call getText() when you are clicking the ViewLineNumbers menue item. I modified your code. Check it.

public class ViewLineNumbs extends javax.swing.JFrame {
int i=0;
JTextArea tx,lines;
JScrollPane scrollpane;
public ViewLineNumbs() {
    initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    tp = new javax.swing.JTabbedPane();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    Create = new javax.swing.JMenuItem();
    ViewLineNumbers = new javax.swing.JCheckBoxMenuItem();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jMenu1.setText("File");

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

    ViewLineNumbers.setSelected(true);
    ViewLineNumbers.setText("ViewLineNumbers");
    ViewLineNumbers.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            ViewLineNumbersActionPerformed(evt);
        }
    });
    jMenu1.add(ViewLineNumbers);

    jMenuBar1.add(jMenu1);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tp, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(tp, 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);
    tx=new JTextArea();
    tx.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
    scrollpane=new JScrollPane(tx);
    internalFrame.add(scrollpane);
    tp.add(internalFrame);
    internalFrame.setSize(internalFrame.getMaximumSize());
    internalFrame.pack();
    internalFrame.setVisible(true);
}                                      

private void ViewLineNumbersActionPerformed(java.awt.event.ActionEvent evt) {                                                

        ViewLineNumbers.addItemListener(new ItemListener() {
               @Override
               public void itemStateChanged(ItemEvent ie) {
                  if(ViewLineNumbers.getState()){
                    lines = new JTextArea("");
                    lines.setBackground(Color.LIGHT_GRAY);
            lines.setEditable(false);
                    lines.setSize(10,10);
                    lines.setFont(new java.awt.Font("Miriam Fixed", 0, 13));
                    lines.setText(getText());
                    tx.getDocument().addDocumentListener(new DocumentListener(){

        @Override
        public void changedUpdate(DocumentEvent de) {
            lines.setText(getText());
        }
        @Override
        public void insertUpdate(DocumentEvent de) {
            lines.setText(getText());
        }

        @Override
        public void removeUpdate(DocumentEvent de) {
            lines.setText(getText());
        }
    });

                   scrollpane.getViewport().add(tx);
                   scrollpane.setRowHeaderView(lines); 
                   }
                   else{
                       scrollpane.setRowHeaderView(null);

                   }
               }
          });
}                                               
public String getText(){
    int caretPosition = tx.getDocument().getLength();
    Element root = tx.getDocument().getDefaultRootElement();
    String text = "1" + System.getProperty("line.separator");
    for(int i = 2; i < root.getElementIndex( caretPosition ) + 1; i++){
        text += i + System.getProperty("line.separator");
    }
    return text;
 }
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(ViewLineNumbs.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(ViewLineNumbs.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(ViewLineNumbs.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(ViewLineNumbs.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 ViewLineNumbs().setVisible(true);
        }
    });
}
// Variables declaration - do not modify                     
private javax.swing.JMenuItem Create;
private javax.swing.JCheckBoxMenuItem ViewLineNumbers;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JTabbedPane tp;
// End of variables declaration 
}
Arijit
  • 1,633
  • 2
  • 21
  • 35
0

The first thing I did was extract the DocumentListener into it's own class...

public class LineDocumentListener implements DocumentListener {

    private JTextComponent input;
    private JTextComponent output;

    public LineDocumentListener(JTextComponent comp, JTextComponent output) {
        this.input = comp;
        this.output = output;
        output.setText(getText());
    }

    public String getText() {
        int caretPosition = input.getDocument().getLength();
        Element root = input.getDocument().getDefaultRootElement();
        String text = "";
        int i = 1;
        for (; i < root.getElementIndex(caretPosition) + 1; i++) {
            text += i + System.getProperty("line.separator");
        }
        text += Integer.toString(i);
        return text;
    }

    @Override
    public void changedUpdate(DocumentEvent de) {
        output.setText(getText());
    }

    @Override
    public void insertUpdate(DocumentEvent de) {
        output.setText(getText());
    }

    @Override
    public void removeUpdate(DocumentEvent de) {
        output.setText(getText());
    }
}

This allowed me to initialise the lines view when it was applied...

The other change I made was modify the "line counting" loop, basically starting at 1 and appending the last line after the loop, instead of the start...

int i = 1;
for (; i < root.getElementIndex(caretPosition) + 1; i++) {
    text += i + System.getProperty("line.separator");
}
text += Integer.toString(i);
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366