3

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.

Balasaheb
  • 625
  • 2
  • 12
  • 33

2 Answers2

2

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.
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
  • @mKorbel: Oops, I should have said `revalidate()`, illustrated [here](http://stackoverflow.com/a/4130167/230513); thanks for review. – trashgod Jun 18 '12 at 15:44
  • this invalidate is some of historical methods without clear reason, [I tried, I tested](http://stackoverflow.com/a/10985931/714968) – mKorbel Jun 18 '12 at 15:55
  • Ah, `revalidate()` _calls_ `invalidate()` to support Swing deferred automatic layout. – trashgod Jun 18 '12 at 18:38
1

I got the answer, actually the problem is, I have set maximum size for panel and all dynamically generated buttons placed at single line, that are added till max size not encountered, but functions cannot communicate other one hence we need to change size dynamically and that will happen by modifying FlowLayout interface.

you can use modified layout rather than FlowLayout.

Balasaheb
  • 625
  • 2
  • 12
  • 33