JPanel里面的一个JScrollPane里面有一个JFrame里面的JPanel

时间:2014-12-11 20:28:57

标签: java swing jpanel jscrollpane

我有一个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);

    }
}

1 个答案:

答案 0 :(得分:1)

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部分中的内容被调整大小以适合父级中的可用空间。