代码之家  ›  专栏  ›  技术社区  ›  user1220590

在JPanel中向左向右移动

  •  1
  • user1220590  · 技术社区  · 9 年前

    我想向JPanel动态添加一些按钮,当我添加时,它只显示固定数量的按钮,

    enter image description here

    所以我想添加一个左右移动按钮来查看所有按钮

    enter image description here

    我们如何做到这一点,是否有任何java组件可以做到这一步?

    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));
        }
    } }
    
    3 回复  |  直到 9 年前
        1
  •  1
  •   camickr    9 年前

    下面是一些我曾经使用过的旧代码,可以根据需要自动添加/删除左/右按钮:

    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();
                }
            });
        }
    }
    
        2
  •  0
  •   Community CDub    7 年前
    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));
        }
    } 
    

    如果外观不让您满意,请参见例如 Custom design JScollPane Java Swing 阅读定制外观和感觉

        3
  •  0
  •   user1220590 user1220590    9 年前

    我有一个解决方案,我们可以使用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);
        }
    }}