繁体   English   中英

在JFrame内的JPanel内的JScrollPane内的JPanel

[英]JPanel inside a JScrollPane inside a JPanel inside a JFrame

我有一个JFrame,向其中添加了自定义JPanel类。 该JPanel类具有两个成员变量,另一个JPanel和一个JScrollPane。

我使用子JPanel构造了JScrollPane,然后尝试将JScrollPane添加到父JPanel,希望我将拥有一个可滚动的自定义JPanel。

我所有组件的前面都有一条大而细的白线,它们没有滚动。 有任何想法吗?

public class CreateGamePanel extends JPanel
{   
    private JLabel pwLabel;
    private JTextField password;

    private JScrollPane jsp;
    private JPanel area;

    public CreateGamePanel()
    {
        area = new JPanel();
        area.setLayout(new BoxLayout(area,BoxLayout.Y_AXIS));

        jsp = new JScrollPane(area);

        pwLabel = new JLabel("Password");
        password = new JTextField();

        for(int i=0;i<20;i++)
        {
            area.add(new JButton("Hello"));
        }

        area.add(pwLabel);
        area.add(password); 

        add(jsp);
    }

    public static void main(String[] args)
    {
        JFrame f = new JFrame();

        CreateGamePanel cp = new CreateGamePanel();

        f.add(cp);
        f.setSize(500,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

    }
}

JScrollPane中滚动条的默认策略是仅在子组件的大小不适合窗格内时显示。 您的代码中发生的事情是JScrollPane的父级是游戏面板,并且会自动调整其大小以包含整个JScrollPane及其子级,而不是被迫容纳在JFrame的可用空间中。 为此,您只需要更具体地设置布局即可。

试试下面的代码,例如:

public class CreateGamePanel extends JPanel {
    private JLabel pwLabel;
    private JTextField password;

    private JScrollPane jsp;
    private JPanel area;

    public CreateGamePanel()
    {
        area = new JPanel();
        area.setLayout(new BoxLayout(area,BoxLayout.Y_AXIS));

        jsp = new JScrollPane(area);

        pwLabel = new JLabel("Password");
        password = new JTextField();

        for(int i=0;i<20;i++)
        {
            area.add(new JButton("Hello"));
        }

        area.add(pwLabel);
        area.add(password);

        setLayout(new BorderLayout());    // Change default LinearLayout to BorderLayout
        add(jsp, BorderLayout.CENTER);    // Add child to the central area of BorderLayout
    }

    public static void main(String[] args)
    {
        JFrame f = new JFrame();

        CreateGamePanel cp = new CreateGamePanel();

        f.add(cp, BorderLayout.CENTER);  // Make sure the game panel will be resized to fit frame
        f.setSize(500,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

    }
}

这里的技巧是调整BorderLayout的BorderLayout.CENTER部分中的内容的大小,以适应父级中的可用空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM