setLocation()并不总是与没有布局管理器的面板中的JLabel对象一起使用,这是一个错误吗?

时间:2013-07-19 01:16:11

标签: java layout

所以我在这些论坛上搜索这个问题的答案,但似乎找不到答案。

首先让我说明我完全理解为什么使用null布局管理器是一个坏主意,在这种情况下我基本上没有选择。我正在使用遗留代码库,尝试编写自定义布局管理器来执行正确的布局会非常耗时。一些相关信息:

  1. 此组件的大小永远不会改变
  2. 子组件的大小在添加到父组件
  3. 后永远不会更改
  4. 当用户操作指示它们应该
  5. 时,只有子组件的数量和位置发生变化
  6. 此代码未本地化
  7. 我无法发布代码示例,因为代码是生产软件,并且对于此论坛来说太长了
  8. 代码流程如下:

    • 创建父组件时,构造函数中的布局设置为null。
    • 当用户操作指示他们想要显示信息时,将创建子组件并将其添加到父组件。
    • 然后确定每个组件的正确位置,并通过setLocation()更改位置。

    其中一种子组件是一个或多个JLabel对象。这是我遇到问题的对象。在某些情况下,对JLabel的setLocation()函数的调用将具有x = 52和y = 0的值,但是JLabel被放置在x = 0,y = 0的位置。我已经确认该位置不是被代码的其他一些区域重置为0,0所以现在我想到了Java实现中可能存在一些引起问题的模糊错误。否则,为什么它不尊重对setLocation()的调用?

    我要确认代码的任何其他区域都没有在JLabel上调用setBounds()。在没有使用布局管理器时,还有其他调用会影响组件的位置吗?

2 个答案:

答案 0 :(得分:1)

对于绝对定位,您必须考虑三个步骤,您已经通过将布局设置为null完成了第一步。

下一步是每当您向容器添加组件时,您都要在该组件上使用setBounds(x,y,width,height)方法。
您只使用了setLocation()方法而未设置按钮的大小,如果您希望按钮可显示,则还必须使用setSize(width,height)方法。

毕竟,不要忘记调用Component类的repaint()方法。

答案 1 :(得分:0)

我在java中使用setLocation()做了一些实验 https://dl.dropboxusercontent.com/u/27670533/ani_test.rar

这是src文件好好看看它们可能有帮助