Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding components to JScrollPane dynamically

Tags:

java

swing

awt

I am new to Java Swing I want to develop an POS application which is like this image: enter image description here

To develop this application I am using Eclipse, I have created JPanel which is shown by numbers e.g(1, 2) in image. At no 3 I have added JscrollPan which contain JPanel, now I want to do here when I click a button from panel no 2 that should add new buttons in panel no 3 dynamically and at that time I want to show only three buttons at each line and scroll should be activate only vertically when needed. But I am not able to do that, because when I write scrollPanel.setPreferredSize(new Dimension(2, 3)); vertical scroll cannot work. My Code is here:

public class WelcomeUI extends JFrame {
    private JPanel contentPane;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    WelcomeUI frame = new WelcomeUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public WelcomeUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(Toolkit.getDefaultToolkit().getScreenSize());
        setUndecorated(true);       
        contentPane = new JPanel();
        contentPane.setBackground(Color.LIGHT_GRAY);
        contentPane.setBorder(new EmptyBorder(0, 0, 0, 0));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);        
        header = new JPanel();
        header.setForeground(Color.BLUE);
        FlowLayout fl_header = (FlowLayout) header.getLayout();
        fl_header.setAlignment(FlowLayout.RIGHT);
        fl_header.setVgap(40);
        fl_header.setHgap(0);
        header.setBackground(Color.BLUE);
        contentPane.add(header, BorderLayout.NORTH);

        footer = new JPanel();
        FlowLayout flowLayout = (FlowLayout) footer.getLayout();
        flowLayout.setVgap(10);
        footer.setBackground(Color.BLUE);
        contentPane.add(footer, BorderLayout.SOUTH);

        panel_2 = new JPanel();
        panel_2.setBackground(Color.BLUE);
        contentPane.add(panel_2, BorderLayout.WEST);

        JButton btnSelectRestaurant = new JButton("Select Restaurant");
        btnSelectRestaurant.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                createDynamicButton(e);
            }
        });     
        JButton btnNewButton = new JButton("Select Steward");       
        JButton btnNewButton_1 = new JButton("Select Table");       
        JButton btnNewButton_2 = new JButton("Misc keys");
        GroupLayout gl_panel_2 = new GroupLayout(panel_2);
        gl_panel_2.setHorizontalGroup(
            gl_panel_2.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_panel_2.createSequentialGroup()
                    .addGap(19)
                    .addGroup(gl_panel_2.createParallelGroup(Alignment.LEADING)
                        .addComponent(btnNewButton, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
                        .addComponent(btnSelectRestaurant, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnNewButton_1, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
                        .addComponent(btnNewButton_2, Alignment.TRAILING, 0, 0, Short.MAX_VALUE))
                    .addContainerGap())
        );
        gl_panel_2.setVerticalGroup(
            gl_panel_2.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_panel_2.createSequentialGroup()
                    .addGap(26)
                    .addComponent(btnSelectRestaurant, GroupLayout.PREFERRED_SIZE, 43, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.UNRELATED)
                    .addComponent(btnNewButton, GroupLayout.PREFERRED_SIZE, 47, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.UNRELATED)
                    .addComponent(btnNewButton_1, GroupLayout.PREFERRED_SIZE, 40, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.UNRELATED)
                    .addComponent(btnNewButton_2, GroupLayout.PREFERRED_SIZE, 41, GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(438, Short.MAX_VALUE))
        );
        gl_panel_2.setAutoCreateContainerGaps(true);
        gl_panel_2.setAutoCreateGaps(true);
        panel_2.setLayout(gl_panel_2);

        panel_3 = new JPanel();
        FlowLayout flowLayout_2 = (FlowLayout) panel_3.getLayout();
        flowLayout_2.setHgap(250);
        contentPane.add(panel_3, BorderLayout.EAST);

        scrollPane = new JScrollPane();     
        contentPane.add(scrollPane, BorderLayout.CENTER);       
        scrollPanel = new JPanel();     
        scrollPanel.setPreferredSize(new Dimension(2, 3));
        scrollPane.setViewportView(scrollPanel);        
    }
    protected void createDynamicButton(ActionEvent e) {     
        JButton dynButton = new JButton("My Button");
        dynButton.setPreferredSize(new Dimension(300, 200));        
        scrollPanel.add(dynButton);         
        scrollPanel.validate();
        scrollPanel.revalidate();       
    }   
    private JPanel header;
    private JPanel footer;
    private JPanel panel_2;
    private JPanel panel_3;
    private JPanel scrollPanel;
    private JScrollPane scrollPane;
}

So, please tell me where I am doing wrong. Thanks in advance.

like image 719
Balasaheb Avatar asked Aug 29 '26 01:08

Balasaheb


1 Answers

Focusing on panel 3, consider the following:

  1. Give the panel a GridLayout(0, 3), which specifies an arbitrary number rows in three columns.
  2. Implement the Scrollable interface, and let getPreferredScrollableViewportSize() return a a Dimension that is a multiple of the button height.
  3. As each button is added, give it a suitable Action.
  4. When adding a button, revalidate() the panel and repaint() it.
like image 149
trashgod Avatar answered Aug 31 '26 15:08

trashgod



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!