Search code examples
javaswingjpaneljscrollpanejapplet

JScrollPane is not working with JPanel


I'm trying to add the scrollbar with the JTextArea but it is not working and the content goes out of the textArea. I have followed the several articles but didn't find any example with the JPanel all the examples are available with the JFrame. Currently we are restricted to use the JFrame so we have to do this without using it. Please find the below code that's how I'm trying to implement the scroll with teatArea and please guide me what I'm doing wrong. Help will be appreciated.

GUI of below code

Code

public class CreatePanel extends JPanel
 {
   private Vector athleteList;
   private CountPanel cPanel;

   private JTextField txt_firstName;
   private JTextField txt_lastName;
   private JTextField txt_sport;

   private JButton btnNewButton;

   private JLabel lbl_error;
   private JLabel lblNewLabel;
   private JLabel lblNewLabel_1;
   private JLabel lblNewLabel_2;
   private JList list;
   private JTextArea textArea;
 //Constructor initializes components and organize them using certain layouts
 public CreatePanel(Vector athleteList, CountPanel cPanel)
  {
    this.athleteList = athleteList;
    this.cPanel = cPanel;
    ButtonListener buttonListener = new ButtonListener();
    //organize components here

    txt_firstName = new JTextField();
    txt_firstName.setColumns(10);

    txt_lastName = new JTextField();
    txt_lastName.setColumns(10);

    txt_sport = new JTextField();
    txt_sport.setColumns(10);

    lblNewLabel = new JLabel("First Name");
    lblNewLabel_1 = new JLabel("Last Name");
    lblNewLabel_2 = new JLabel("Sport");

    lbl_error = new JLabel("error");
    lbl_error.setForeground(Color.RED);
    lbl_error.setVisible(false);

    list = new JList<Athlete>();

    btnNewButton = new JButton("Create an Athlete");
    btnNewButton.addActionListener(new ButtonListener());


    textArea = new JTextArea(16,58);
    JScrollPane scroll = new JScrollPane (textArea);
    scroll.setVerticalScrollBarPolicy ( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );
    textArea.setEditable(false);

    add(scroll);
    GroupLayout groupLayout = new GroupLayout(this);
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                        .addGroup(groupLayout.createSequentialGroup()
                            .addContainerGap()
                            .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                                .addComponent(lblNewLabel)
                                .addComponent(lblNewLabel_1)
                                .addComponent(lblNewLabel_2))
                            .addGap(53)
                            .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                                .addComponent(txt_firstName, GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE)
                                .addComponent(txt_lastName, GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE)
                                .addComponent(txt_sport, GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE)))
                        .addGroup(groupLayout.createSequentialGroup()
                            .addGap(59)
                            .addComponent(btnNewButton)))
                    .addGroup(groupLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(lbl_error)))
                .addGap(5)
                .addComponent(textArea, GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)
                .addContainerGap())
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                    .addGroup(groupLayout.createSequentialGroup()
                        .addGap(47)
                        .addComponent(lbl_error)
                        .addGap(53)
                        .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(txt_firstName, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNewLabel))
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
                            .addComponent(lblNewLabel_1)
                            .addComponent(txt_lastName, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(txt_sport, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNewLabel_2))
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addComponent(btnNewButton))
                    .addGroup(groupLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(textArea, GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE)))
                .addContainerGap())
    );
    setLayout(groupLayout);
  }


  //ButtonListener is a listener class that listens to
  //see if the button "Create an Athlete" is pushed.
  //When the event occurs, it adds an athlete using the information
  //entered by a user.
  //It also performs error checking.
  private class ButtonListener implements ActionListener
   {
    public void actionPerformed(ActionEvent event)
     {

         //TO BE COMPLETED
        if(txt_firstName.getText().length() == 0 || txt_lastName.getText().length() == 0 || txt_sport.getText().length() == 0)
        {
            lbl_error.setText("Please enter all fields.");
            lbl_error.setVisible(true);
        }
        else
        {
            Athlete athlete = new Athlete();
            athlete.setFirstName(txt_firstName.getText());
            athlete.setLastName(txt_lastName.getText());
            athlete.setSport(txt_sport.getText());
            athleteList.add(athlete);
            textArea.setText(textArea.getText().concat(athlete.toString()));
            lbl_error.setText("athlete added.");
            //clearControls();
        }
     } //end of actionPerformed method
  } //end of ButtonListener class

  private void clearControls()
  {
    txt_firstName.setText("");
    txt_lastName.setText("");
    txt_sport.setText("");
  }
} //end of CreatePanel class 

Solution

  • Your GroupLayout don't add the scroll to the layout, but the textArea:

    .addComponent(textArea, GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)
    

    Try to add the scroll like

    .addComponent(scroll, GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)