Java 卡片布局中的可滚动JPanel?

Java 卡片布局中的可滚动JPanel?,java,swing,user-interface,layout,cardlayout,Java,Swing,User Interface,Layout,Cardlayout,我一直在寻找一种方法,将垂直滚动条添加到JPanel,然后将其添加到CardLayout面板。我在这里查阅了所有关于实现可滚动的JPanel的帖子,但我不知道如何用这个特定的CardLayout实现它。Oracle也没有给出我可以使用的示例 也许我没有为JWindow或我使用的任何其他组件使用正确的配置 我在下面放了一个精简版的程序,我想为它实现一个垂直滚动条 我的问题是如何在代码底部实现JPanelScrollable类,以便它可以滚动 import javax.swing.*; impor

我一直在寻找一种方法,将垂直滚动条添加到
JPanel
,然后将其添加到
CardLayout
面板。我在这里查阅了所有关于实现可滚动的
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) ;
        }

    }
}
import javax.swing.*;
导入java.awt.*;
导入java.net.URL;
公共类程序2扩展了JFrame
{
公共计划2()
{
超级(“闪光CC”);
Container2 container=新Container2();
设置大小(700800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(空);
设置聚焦(真);
添加(容器);
setVisible(真);
}
公共静态void main(字符串[]args)
{
Program2 prog=新程序2();
}
}
类Container2扩展了JPanel
{
private CardLayout CardLayout=新的CardLayout();
private JPanel1 jPanelFirst=new JPanel1();
private JPanel2 jPanelSecond=new JPanel2();
private JPanelScrollable jpanelhird=新的JPanelScrollable();
//建造师
容器2()
{
这个.setLayout(cardlyout);
此参数为.setFocusable(true);
JScrollPane scrollFrame=新的JScrollPane(jpanethird);
添加(jPanelFirst,“第一张卡”);
添加(jPanelSecond,“第二张卡”);
添加(滚动框,“第三张卡”);
cardLayout.show(这是“第三张卡”);
}
}
类JPanel1扩展了JPanel
{
}
类JPanel2扩展了JPanel
{
}
类JPanelScrollable扩展了JPanel
{
//这里会有很多很多很多的元素
//需要一个垂直滚动条来查看我的全部。
JPanelScrollable()
{
此.set不透明(true);
此.setLayout(null);
对于(int i=0;i,
容器.add(…)
方法接受任何组件。CardLayout不限于面板


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

容器。Add(…)
方法接受任何组件。卡片布局不限于面板


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

将面板添加到JScrollPane

JScrollPane scrollPane = new JScrollPane(jPanelThird);
将滚动窗格添加到CardLayout

this.add(scrollPane, "third card");
有关更多详细信息,请参阅

使用工作示例更新

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;
    }
}

导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestCardLayout{
公共静态void main(字符串[]args){
新的TestCardLayout();
}
私有整数指数=0;
公共TestCardLayout(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
最终CardLayout cl=新的CardLayout();
最终JPanel cardPane=新JPanel(cl);
添加(新JLabel(“Hello”),“1”);
添加(新的JScrollPane(createForm()),“2”);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(cardPane);
框架。设置尺寸(200200);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
JButton next=新JButton(“next”);
next.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
索引++;
如果(索引>1){
指数=0;
}
如果(索引==0){
cl.show(卡片窗格,“1”);
}否则{
cl.show(卡片窗格,“2”);
}
}
});
frame.add(下一步,BorderLayout.SOUTH);
}
});
}
公共JPanel createForm(){
JPanel form=newJPanel(newGridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
对于(int-index=0;index<100;index++){
新增表格(新JTextField(10),gbc);
}
申报表;
}
}

将面板添加到JScrollPane

JScrollPane scrollPane = new JScrollPane(jPanelThird);
将滚动窗格添加到CardLayout

this.add(scrollPane, "third card");
有关更多详细信息,请参阅

使用工作示例更新

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;
    }
}

导入java.awt.BorderLayout;
导入java.awt.CardLayout;
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
进口