0

I'm trying to adding the scrollpane in a inner panel,and the scrollbar is showing in the inner panel, but as i add the labels and textfield, the components were added but the scroll bar is not working.

public class AddNewProject extends JFrame {
    private JButton btnNewButton;
    private JSpinner spinner;
    private JScrollPane scrollPane;
    private JPanel panel_1;
    
    public AddNewProject() {
        getContentPane().setLayout(null);
        
        JPanel panel = new JPanel();
        panel.setBackground(Color.PINK);
        panel.setBounds(134, 37, 583, 610);
        getContentPane().add(panel);
        panel.setLayout(null);
        
        spinner = new JSpinner();
        spinner.setModel(new SpinnerNumberModel(0, 0, 30, 1));
        spinner.setBounds(63, 51, 164, 31);
        panel.add(spinner);
        
        btnNewButton = new JButton("New button");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                int n=(int) spinner.getValue();
                JLabel jlabel[]=new JLabel[n];
                JTextField jtxt[]=new JTextField[n];
                                
                for(int i =0;i<n;i++)
                {
                    jlabel[i]=new JLabel("Label "+(i+1));
                    jtxt[i]=new JTextField(32);
                    
                    panel_1.add(jlabel[i]);
                    panel_1.add(jtxt[i]);
                }
                panel_1.validate();
                panel_1.repaint();
            }
        });
        btnNewButton.setBounds(336, 54, 149, 28);
        panel.add(btnNewButton);
        
        scrollPane = new JScrollPane();     
        scrollPane.setBounds(69, 141, 434, 298);
        panel.add(scrollPane);
        
        panel_1 = new JPanel();
        
        scrollPane.setViewportView(panel_1);
        scrollPane.setPreferredSize(new Dimension(434,300));
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        
        setSize(900,800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
    }
    public static void main(String[] args) {
        new AddNewProject();
    }
}

Output of the above Program

Output of the above Program

This is the output image of my program.

0

2 Answers 2

1

You need to revalidate the JScrollPane itself for it to re-lay out its viewport and its view for this to work. But you will also need to set the layout of the inner JPanel to allow a grid of things to display for this to work right, such as by giving it a new GridLayout(0, 1) // one column, variable # of rows.

e.g.,

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class AddNewProject2 extends JPanel {
    private JPanel gridPanel = new JPanel(new GridLayout(0, 1)); // 1 column grid
    private JSpinner spinner = new JSpinner(new SpinnerNumberModel(0, 0, 30, 1));
    
    
    public AddNewProject2() {
        JPanel wrapperPanel = new JPanel(new BorderLayout());
        wrapperPanel.add(gridPanel, BorderLayout.PAGE_START);
        JScrollPane scrollPane = new JScrollPane(wrapperPanel);
        scrollPane.getViewport().setPreferredSize(new Dimension(450, 500));
        
        JButton newRowBtn = new JButton("New Row");
        newRowBtn.addActionListener(e -> {
            int rows = (int) spinner.getValue();
            for (int i = 0; i < rows; i++) {
                JLabel label = new JLabel("Label " + String.format("%02d", i + 1));
                JTextField txtFld = new JTextField(32);
                JPanel row = new JPanel();
                row.add(label);
                row.add(txtFld);
                gridPanel.add(row);
            }
            
            scrollPane.revalidate();
        });
        
        JPanel topPanel = new JPanel();
        topPanel.add(spinner);
        topPanel.add(newRowBtn);
        
        int gap = 20;
        setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
        setLayout(new BorderLayout(gap, gap));
        
        add(topPanel, BorderLayout.PAGE_START);
        add(scrollPane);
    }
    
    
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("GUI");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            AddNewProject2 project2 = new AddNewProject2();
            frame.add(project2);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

but why the background color is not setting in the gridpanel even after repainting it
1

The problem is your usage of null layouts everywhere. The scrollbars only appear when the preferred size of a component added to the viewport is greater than the size of the viewport. The preferred size is only calculated dynamically when layout managers are used. So the solution is to use layout managers.

For the most basic changes to your code you are:

  1. remove all the setBounds() statements
  2. remove all the setLayout(null) statements

Then you can start using layout managers.

Start by creating a panel for the top:

JPanel topPanel = new JPanel();
topPanel.add(spinner)
topPanel.add(btnNewButton);
add(topPanel, BorderLayout.PAGE_START);

Then add your scroll pane to the frame:

add(scrollPane, BorderLayout.CENTER);

Now you need to use:

//panel_1.validate();
panel_1.revalidate();

The revalidate() invokes the layout manager so the new preferred size can be calculated.

In your example the horizontal scrollbar will appear because by default a JPanel uses a FlowLayout which displays components on a single line.

If you want the components added vertically then you will need to use a different layout manager on "panel_1".

Read the section from the Swing tutorial on Layout Managers for more information and examples.

1 Comment

Thank you for making me understand the concept

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.