1

I want to add a number of buttons to a JPanel dynamically, When I add it only shows a fixed number of buttons,

enter image description here

So I would like to add a left right moving for viewing all buttons

enter image description here

How we can do this, Is there any java component to do this?

public class TestJPanel extends JFrame {
JPanel statusBar;
public TestJPanel() {
    setLayout(new BorderLayout());
    statusBar = new JPanel();
    statusBar.setLayout(new BoxLayout(statusBar, BoxLayout.LINE_AXIS));
    add("South", statusBar);
    for (int i = 1; i < 20; i++) {
        statusBar.add(new Button("Button" + i));
    }
} }
  • 4
    [`Scrolling a JPanel`](http://stackoverflow.com/questions/10346449/scrolling-a-jpanel) – Uma Kanth Jul 21 '15 at 08:57
  • Could you post the code where you add the buttons? – milez Jul 21 '15 at 09:03
  • I added the code, I tried JScrollPane, But it looks too old, I need a fresh look, Please see my second image –  Jul 21 '15 at 09:49
  • It should be possible to wrap `JViewPort` with a custom way to scroll. *However*, I'd be really wary of making a non standard component that users are not familiar with, especially one that is less convenient to scroll than the standard `JScrollPane`. – kiheru Jul 21 '15 at 10:02
  • What do you mean `it looks too old`? You do know you can change the look and feel right? – Jurgen Camilleri Jul 21 '15 at 10:04
  • I Would like to add two buttons at the right side of the JPanel, One for scroll left and one for scroll right, Please help me to do scroll left and right on Button Click –  Jul 21 '15 at 10:25

3 Answers3

1

Here is some old code I had lying around that will automatically add/remove left/right buttons as required:

import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;


public class ScrollContainer extends JPanel
    implements ActionListener, ComponentListener
{
    private Container container;
    private List<Component> removedComponents = new ArrayList<Component>();
    private JButton forwardButton;
    private JButton backwardButton;

    public ScrollContainer(Container container)
    {
        this.container = container;
        setLayout( new BorderLayout(5, 0) );
        addComponentListener( this );

        //  Create buttons to control scrolling

        backwardButton = new BasicArrowButton( BasicArrowButton.WEST );
        configureButton( backwardButton );
        forwardButton = new BasicArrowButton( BasicArrowButton.EAST);
        configureButton( forwardButton );

        //  Layout the panel

        add( backwardButton, BorderLayout.WEST );
        add( container );
        add( forwardButton, BorderLayout.EAST );
    }

    //  Implement the ComponentListener

    public void componentResized(ComponentEvent e)
    {
        //  When all components cannot be shown, add the forward button

        int freeSpace = getSize().width - container.getPreferredSize().width;

        if (backwardButton.isVisible())
            freeSpace -= backwardButton.getPreferredSize().width;

        forwardButton.setVisible( freeSpace < 0 );

        //  We have free space, redisplay removed components

        while (freeSpace > 0 && ! removedComponents.isEmpty())
        {
            if (removedComponents.size() == 1)
                freeSpace += backwardButton.getPreferredSize().width;

            Object o = removedComponents.get(removedComponents.size() - 1);
            Component c = (Component)o;
            freeSpace -= c.getSize().width;

            if (freeSpace >= 0)
            {
                container.add(c, 0);
                removedComponents.remove(removedComponents.size() - 1);
            }
        }

        //  Some components still not shown, add the backward button

        backwardButton.setVisible( !removedComponents.isEmpty() );

//      repaint();

    }

    public void componentMoved(ComponentEvent e) {}
    public void componentShown(ComponentEvent e) {}
    public void componentHidden(ComponentEvent e) {}

    //  Implement the ActionListener

    public void actionPerformed(ActionEvent e)
    {
        Object source = e.getSource();

        //  Scroll the components in the container

        if (source == forwardButton)
            scrollForward();
        else
            scrollBackward();
    }

    /*
     *  Simulate scrolling forward
     *  by remove the first component from the container
     */
    private void scrollForward()
    {
        if (container.getComponentCount() == 1)
            return;

        //  Remove and save the first component

        Component c = container.getComponent(0);
        container.remove( c );
        removedComponents.add( c );

        //  Allow for backwards scrolling

        backwardButton.setVisible( true );

        //  All components are showing, hide the forward button

        int backwardButtonWidth = backwardButton.getPreferredSize().width;
        int containerWidth = container.getPreferredSize().width;
        int panelWidth = getSize().width;

        if (backwardButtonWidth + containerWidth <= panelWidth)
            forwardButton.setVisible( false );

        //  Force a repaint of the panel

        revalidate();
        repaint();
    }

    /*
     *  Simulate scrolling backward
     *  by adding a removed component back to the container
     */
    private void scrollBackward()
    {
        if (removedComponents.isEmpty())
            return;

        //  Add a removed component back to the container

        Object o = removedComponents.remove(removedComponents.size() - 1);
        Component c = (Component)o;
        container.add(c, 0);

        //  Display scroll buttons when necessary

        if (removedComponents.isEmpty())
            backwardButton.setVisible( false );

        forwardButton.setVisible( true );
        revalidate();
        repaint();
    }

    private void configureButton(JButton button)
    {
        button.setVisible( false );
        button.addActionListener( this );
    }

    private static void createAndShowGUI()
    {
        JToolBar toolBar = new JToolBar();
        toolBar.setFloatable(false);
        toolBar.add( new JButton("one") );
        toolBar.add( new JButton("two222222") );
        toolBar.add( new JButton("three") );
        toolBar.add( new JButton("four") );
        toolBar.add( new JButton("five") );
        toolBar.add( new JButton("six666666666") );
        toolBar.add( new JButton("seven") );
        toolBar.add( new JButton("eight") );
        toolBar.add( new JButton("nine9999999") );
        toolBar.add( new JButton("ten") );
        ScrollContainer container = new ScrollContainer(toolBar);

        JFrame frame = new JFrame("Scroll Container");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(container, BorderLayout.NORTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}
camickr
  • 321,443
  • 19
  • 166
  • 288
0
public TestJPanel() 
{
    setLayout(new BorderLayout());

    statusBar = new JPanel();
    statusBar.setLayout(new BoxLayout(statusBar, BoxLayout.LINE_AXIS));

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setViewportView(statusBar)

    add(scrollPane, BorderLayout.SOUTH);
    for (int i = 1; i < 20; i++) {
        statusBar.add(new Button("Button" + i));
    }
} 

If the look does not satisfy you, see for example Custom design JScollPane Java Swing and read about custom Look and Feels

Community
  • 1
  • 1
milez
  • 2,201
  • 12
  • 31
0

I got one solution , we can implement left right navigation by using JViewport

public class StatusBar extends JFrame {
private final JPanel statusBar; 
private final JPanel leftrightPanel;
private final JPanel myPane;
private final JButton rightButton;
private final JButton leftButton;
private final JViewport viewport;
private final JPanel iconsPanel;
private JButton button;   
public StatusBar() {
    setLayout(new BorderLayout());
    statusBar = new JPanel();
    statusBar.setLayout(new BorderLayout());
    iconsPanel = new JPanel();
    iconsPanel.setLayout(new BoxLayout(iconsPanel, BoxLayout.LINE_AXIS));
    iconsPanel.setBackground(Color.LIGHT_GRAY);
    viewport = new JViewport();
    viewport.setView(iconsPanel);
    leftrightPanel = new JPanel();
    leftrightPanel.setBackground(Color.WHITE);
    rightButton = new BasicArrowButton(BasicArrowButton.WEST);
    rightButton.addActionListener((ActionEvent e) -> {
        int iconsPanelStartX = iconsPanel.getX();
        if (iconsPanelStartX < 0) {
            Point origin = viewport.getViewPosition();
            if (Math.abs(iconsPanelStartX) < 20) {
                origin.x -= Math.abs(iconsPanelStartX);
            } else {
                origin.x -= 20;
            }
            viewport.setViewPosition(origin);
        }
    });
    leftButton = new BasicArrowButton(BasicArrowButton.EAST);
    leftButton.addActionListener((ActionEvent e) -> {
        Point origin = viewport.getViewPosition();
        origin.x += 20;
        viewport.setViewPosition(origin);
    });
    leftrightPanel.add(rightButton);
    leftrightPanel.add(leftButton);
    statusBar.add(viewport);
    statusBar.add(leftrightPanel, BorderLayout.LINE_END);
    add(statusBar,BorderLayout.SOUTH);
    myPane = new JPanel();
    add(myPane, BorderLayout.CENTER);
    for (int i = 1; i < 20; i++) {
        button =new JButton("Button " + i);
        iconsPanel.add(button);
    }
}}