I have a GUI that looks as follow:
When I push on the button addComponent there are new JPanels added to the scrollPane(1), the JPanels are added but the scrollpane is not scrolling, what happens is that it add the new JPanels and the jPanels are decreasing in size.
Thus my problem is that the panels are inserted in the JScrollPane and that the size of these panels are decreasing but there is no scrollbar.
here is my code i have sow far:
public class ContractForm extends JFrame {
private JPanel contentPane;
private JTextField txtContractID;
private JScrollPane scrollPane;
private JButton btnAddComponent;
private JButton btnOk;
private JComboBox<Customer> comboBoxCustomer;
private JButton btnCancel;
private ArrayList<JPanel> rows;
private JPanel panel;
private Dimension size;
/**
* Create the frame.
*/
public ContractForm() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(250, 250, 654, 476);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
rows = new ArrayList<JPanel>();
JLabel lblContractid = new JLabel("ContractID");
lblContractid.setBounds(50, 11, 78, 14);
contentPane.add(lblContractid);
txtContractID = new JTextField();
txtContractID.setBounds(138, 8, 86, 20);
contentPane.add(txtContractID);
txtContractID.setColumns(10);
JLabel lblNewLabel = new JLabel("Customer");
lblNewLabel.setBounds(276, 11, 69, 14);
contentPane.add(lblNewLabel);
comboBoxCustomer = new JComboBox<Customer>();
comboBoxCustomer.setBounds(355, 8, 235, 20);
contentPane.add(comboBoxCustomer);
JLabel lblYear = new JLabel("Year:");
lblYear.setBounds(50, 37, 46, 14);
contentPane.add(lblYear);
JSpinner spinner = new JSpinner();
spinner.setBounds(138, 31, 86, 20);
contentPane.add(spinner);
scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setBounds(0, 59, 628, 312);
contentPane.add(scrollPane);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
size = panel.getSize();
scrollPane.setViewportView(panel);
btnAddComponent = new JButton("addComponent");
btnAddComponent.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
ArrayList<JobDescription> jobs = Database.getInstance().getJobDescription();
JobDescriptionContractRow row = new JobDescriptionContractRow(jobs);
rows.add(row);
panel.add(row);
scrollPane.repaint();
scrollPane.revalidate();
}
});
btnAddComponent.setBounds(355, 30, 114, 23);
contentPane.add(btnAddComponent);
btnOk = new JButton("Ok");
btnOk.setBounds(185, 382, 89, 23);
contentPane.add(btnOk);
btnCancel = new JButton("Cancel");
btnCancel.setBounds(298, 382, 89, 23);
contentPane.add(btnCancel);
}
}
public class JobDescriptionContractRow extends JPanel {
private JTextField textField;
private JButton btnRemove;
/**
* Create the panel.
*/
public JobDescriptionContractRow(ArrayList<JobDescription> jobs) {
setLayout(null);
JLabel lblJobdescription = new JLabel("Job description");
lblJobdescription.setBounds(10, 14, 94, 14);
add(lblJobdescription);
JComboBox<JobDescription> comboBox = new JComboBox<JobDescription>();
comboBox.setBounds(102, 11, 149, 20);
for(JobDescription job : jobs){
comboBox.addItem(job);
}
comboBox.setSelectedItem(null);
add(comboBox);
textField = new JTextField();
textField.setBounds(365, 11, 86, 20);
add(textField);
textField.setColumns(10);
JLabel lblNewLabel = new JLabel("Contract price");
lblNewLabel.setBounds(277, 14, 78, 14);
add(lblNewLabel);
JButton btnRemove = new JButton("remove");
btnRemove.setBounds(469, 10, 89, 23);
add(btnRemove);
}
}
JPanel (your JScrollPane view component) uses FlowLayout by default which respects preferred sizes of components. You can override getPreferredSize of your added JPanels to size them correctly. Without doing this, the JScrollPane calculates all sizes to fit in the ViewPortView.
Side Note: Avoid using absolute positioning (null layout) and use a layout manager.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With