当前位置: 首页 > 面试题库 >

在不使用布局管理器的情况下将JScrollPane添加到JPanel

卫开济
2023-03-14
问题内容

在开始之前,我知道不使用布局管理器是一个坏主意,通常我确实会使用一个布局管理器,但是,我还让所有组件根据窗口的大小自动调整大小并重新放置。另外,我正在使用的程序只能在整个生命周期中在一台计算机上运行。请不要仅仅因为缺少布局管理器而对我投反对票,我发现这正是我为此特定程序所需要的。

对于我的问题,我在stackoverflow上找到了类似的帖子,但从未实现解决方案。我加入的动态量JLabels我的JPanel,我注意到,不使用布局管理器时,滚轮不起作用。

这是我的初始化代码的简化版本。

JPanel mypanel = new JPanel();
mypanel.setLayout(null);
mypanel.setSize(800,450);
mypanel.setForeground(Color.WHITE);
mypanel.setBackground(Color.BLACK);
scrollablePanel = new JScrollPane(mypanel);
scrollablePanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollablePanel.setPreferredSize(new Dimension(800,300));
scrollablePanel.setSize(800,300);
scrollablePanel.setLocation(250,156);
myContainer.add(scrollablePanel);

myContainer容器在哪里(也没有布局管理器)。在JLabels加入后到JPanel用:

enter code heremypanel.add(label1);

在为标签设置了一些基本设置后,例如setForegroundsetBackground

不幸的是,在运行时,滚动条看起来好像不是必需的(参见图片)

http://i.imgur.com/zp0QKGG.png

图像中显示的表格文本由多个组成JLabels。如果不使用布局管理器无法解决问题,我将切换到BoxLayout,我只是希望有解决方案。


问题答案:

问题是JScrollPanel需要视图组件的首选大小来确定视图何时超出滚动窗格的可见区域。

组件的首选大小通常是通过布局管理器确定的。虽然您可以使用setPreferredSize,但通常不建议使用它,因为内容超出您决定设置的值时,您只会遇到相同的问题。

更好的解决方案是使用一个LayoutManager或复合布局(在多个容器上使用多个布局管理器)来获得所需的结果…或编写自己的…



 类似资料:
  • 我试图使用创建一个厨房显示系统,并试图找出一种方法,当第一行已经满了时,在第二行添加另一个面板。GUI的宽度将根据用户的喜好而改变。当更宽时,它应该每行显示更多的组件。

  • 问题内容: 我有一个gui,它的Panel包含一系列标签和TextField,并使用spring布局(这是mainPanel),而另一个Panel仅包含button(buttonPanel)。我正在尝试使我的mainPanel也具有垂直滚动条。我想实现我的GUI,以便在JFrame中有2个面板。mainPanel出现在框架的顶部,而buttonPanel出现在mainPanel的下方。 我的问题是

  • 我目前有一个主JFrame包含几个JPanels,每个面板中都有一些文本。创建JPanels的代码在一个单独的类中(它“实现”JPanels)。如何仅向单个面板添加JScrollPane? 我已经花了一些时间尝试这样做,但什么也没有发生。顺便说一下,我的JPanel使用GridLayout 上面的类是另一个面板类的实例变量,它是主面板“MenuHold”的实例变量。但使用“MenuHolder”的

  • 问题内容: 我希望能够以不同于web.xml的方式修改/配置过滤器。这是2个过滤器的静态配置。我希望能够静态配置一个过滤器,并允许该过滤器加载其他过滤器。我只是想知道是否有人知道lib已有此功能。 使用Servlet API 2.5 我已经在Guice的GuiceFilter中完成了此操作,其中在运行时配置了过滤器。 问题答案: 只需执行与容器已完成的相同的工作即可。即,按照servlet过滤器所

  • 问题内容: 我希望在不停止应用程序的情况下分析Java应用程序。我可以在应用程序运行时以某种方式添加Javaagent吗? 问题答案: 根据java.lang.instrument软件包的文档,应该是可能的。 VM启动后启动代理 一个实现可以提供一种机制,可以在VM启动之后的某个时间启动代理。有关如何启动的详细信息是特定于实现的,但通常应用程序已启动并且其主要方法已被调用。在虚拟机启动后实现支持启

  • 问题内容: 我有两个活动,我分别从这两个活动向Firestore添加数据。但是,每当我向Firestore添加第二个活动数据时,它就会覆盖第一个活动数据。我在以下两个活动中使用了以下代码: 如何停止覆盖?我想将两个“活动”数据保存在同一文件夹中。 问题答案: 我建议您再添加一个文档或集合,以便它可以为单个用户存储多个数据值。 您可以为两个活动创建文档参考: 或者,您可以为其创建一个子集合: 更多关