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

CardLayout中的可滚动JPanel?

  •  2
  • user9349193413  · 技术社区  · 12 年前

    我一直在寻找一种方法,将垂直滚动条添加到 JPanel 然后将其添加到 CardLayout 面板我在这里查找了所有与实现可滚动 面板 但我不知道如何用这个特定的 卡片布局管理器 Oracle也没有给出我可以使用的示例。

    也许我没有使用正确的配置 JWindow 或我使用的任何其他组件。

    我在下面放了一个精简版的程序,我想实现一个垂直滚动条。

    我的问题是如何实施 JPanelScrollable 类,以便它可以滚动?

    import javax.swing.*;
    
    import java.awt.*;
    
    import java.net.URL ;
    
    
    public class Program2 extends JFrame
    {
        public Program2()
        {
            super("Flash CC");
            Container2 container = new Container2();
            setSize(700, 800);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setFocusable( true ) ;
            add(container);
    
            setVisible(true) ; 
        }
    
    
        public static void main(String[] args)
        {
            Program2 prog = new Program2();
        }
    }
    
    class Container2 extends JPanel
    {
        private CardLayout          cardLayout   = new CardLayout() ;
        private JPanel1             jPanelFirst  = new JPanel1() ;
        private JPanel2             jPanelSecond = new JPanel2() ;
        private JPanelScrollable    jPanelThird  = new JPanelScrollable() ;
    
        //Constructor
        Container2()
        {
            this.setLayout( cardLayout )   ;
            this.setFocusable( true ) ;
    
            JScrollPane scrollFrame = new JScrollPane(jPanelThird);
    
            this.add( jPanelFirst,  "first card" )  ;
            this.add( jPanelSecond, "second card" ) ;
            this.add( scrollFrame , "third card" ) ;
    
            cardLayout.show( this, "third card" ) ;
        }
    }
    
    class JPanel1 extends JPanel
    {
    
    }
    
    class JPanel2 extends JPanel
    {
    
    }
    
    class JPanelScrollable extends JPanel
    {
        // here many, many, many elemnts will go 
        // and a vertical scroll barr is needed to   view'm all.
        JPanelScrollable()
        {
            this.setOpaque( true ) ;
            this.setLayout( null ) ;
            for(int i=0; i<30; i++)
            {
                JButton b = new JButton("Button" + i) ;
                b.setBounds(0, (i * 100), 100, 50) ;
                this.add(b) ;
            }
    
        }
    }
    
    3 回复  |  直到 12 年前
        1
  •  2
  •   MadProgrammer    12 年前

    将面板添加到JScrollPane

    JScrollPane scrollPane = new JScrollPane(jPanelThird);
    

    将滚动窗格添加到CardLayout

    this.add(scrollPane, "third card");
    

    看见 How to use scroll panes 有关详细信息

    更新工作示例

    Card1 Card2

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TestCardLayout {
    
        public static void main(String[] args) {
            new TestCardLayout();
        }
    
        private int index = 0;
    
        public TestCardLayout() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                        ex.printStackTrace();
                    }
    
                    final CardLayout cl = new CardLayout();
                    final JPanel cardPane = new JPanel(cl);
                    cardPane.add(new JLabel("Hello"), "1");
                    cardPane.add(new JScrollPane(createForm()), "2");
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(cardPane);
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
    
                    JButton next = new JButton("Next");
                    next.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            index++;
                            if (index > 1) {
                                index = 0;
                            }
                            if (index == 0) {
                                cl.show(cardPane, "1");
                            } else { 
                                cl.show(cardPane, "2");
                            }
                        }
                    });
                    frame.add(next, BorderLayout.SOUTH);
                }
    
            });
        }
    
        public JPanel createForm() {
            JPanel form = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            for (int index = 0; index < 100; index++) {
                form.add(new JTextField(10), gbc);
            }
            return form;
        }
    }
    
        2
  •  2
  •   camickr    12 年前

    这个 Container.add(...) 方法接受任何组件。CardLayout不限于面板。

    将面板添加到JScrollPane,并将滚动窗格添加到卡片布局中。

        3
  •  0
  •   Tareq    12 年前

    如果您正在使用eclipse,请考虑使用 WindowBuilder 。它是免费的,允许您通过拖放和更改一些财产来执行所需的操作。