当前位置: 首页 > 知识库问答 >
问题:

JFrame中的JPanel中的JScrollPane中的JPanel

沈树
2023-03-14

我使用子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个答案

邵刚洁
2023-03-14

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.Center部分中的内容的大小,以适应父级中的可用空间。

 类似资料:
  • 问题内容: 我有一个JFrame,在这个JFrame中,我有一个绘制的JPanel,此Panel可以是任何大小,因此我将其放在JScrollpane中,以便当面板大于窗口屏幕大小时可以滚动。 不幸的是,它没有按我预期的那样工作: 使JFrame窗口小于JPanel大小不会显示滚动条 现在,JScrollPane的大小似乎已锁定为我添加到其中的JPanel的大小,就像以前一样,它的大小已调整为JFr

  • 我想在我的基本框架中添加一个带有JPanel的JScrollpane 如果我将带有的直接添加到中,就可以了。但是现在,当我将帧的大小减小到500像素以下时,变得更小,如第二张图片所示。 如何使JScrollPane工作?

  • 问题内容: 我正在学习Java gui。我学会了创建窗口的方法是继承或扩展类,并且很好地使用它,因为它包含窗口的所有属性。现在,如果要在此窗口中添加一些内容,则需要使用方法。但是今天我碰到了一个窗口,我们可以通过添加东西。 两种方法有什么区别?它们之间有某种联系吗? 问题答案: 您不应不必要地扩展该类(仅当您向该类添加其他功能时) JFrame : 扩展和。 它是一个顶层容器,用于表示窗口的最低要

  • 我有一个带有卡布局组件的JFrame。我正在使用卡布局在应用程序执行的不同时刻在不同的JPanel之间切换。在某些时候,我正在使用摇摆工人对象来生成一些XML文件。在这段时间里,我想在我的窗口中显示另一个JPanel,告诉用户等待。在这个JPanel上,我想在3个标签之间切换。 吉列布尔1会说:“请稍候。 吉拉贝尔2会说:“请稍候..” 吉拉贝尔3会是:“请稍候...” 现在代码如下: Swing

  • 我正在学习Java GUI。我学习创建窗口的方法是继承或扩展类,使用它是很好的,因为包含窗口的所有属性。现在如果我想在这个窗口中添加一些东西,我需要使用方法。但是今天我遇到了,它也创建了一个windows,我们可以通过添加内容。 这两种方法有什么区别?他们有什么关系吗?

  • 我目前正在尝试使用Swift中的GridBagLayout构建GUI。 在尝试为我正在处理的项目制作GUI时,遇到了一个问题: 创建物品列表时,面板超过了我的屏幕高度,因此我将框架的首选大小设置为900像素。 但是,该列表的高度超过900像素。因此,我尝试将一个JScrollPane添加到包含列表的面板中。只是没有一个。 我的框架架构是这样的:框架f- 我将ScrollPane应用于这些对象中的任