【问题标题】:Get size of JPanel before realizing在实现之前获取JPanel的大小
【发布时间】:2011-12-04 07:25:46
【问题描述】:

我已经创建了 JPanel,并且已经在其中添加了组件,我将把 JPanel 传递给 PopUpFactory... 那么我可以在传递之前获取 JPanel 的大小吗?

我将 Jlabel 放入其中并在其后添加文本,但我不知道该文本的大小......

【问题讨论】:

  • 工厂应根据需要调整面板尺寸。如果没有,请查看 kleopatra 和 camickr 在Why does the JTable header not appear in the image? 上的答案,重点是创建图像,但图像构造函数需要大小。
  • 嗯不太了解您的设置 - 您首先显示弹出窗口,然后将标签文本从 null 设置为其他内容?为什么/何时/什么控制文本设置?顺便说一句,最好展示一个小的可运行示例以便快速查看:-)
  • 哦,套用法老的话,“为了尽快获得更好的帮助,请发布SSCCE”。 ;)

标签: java swing size jpanel


【解决方案1】:

您可以使用setPreferredSize(Dimension) 设置首选大小;例如

JPanel pnl = new JPanel(new BorderLayout());
pnl.setPreferredSize(new Dimension(640, 480));

该值随后可通过调用getPreferredSize() 获得,并将在布局组件时使用,但请注意,不能保证它实际上会以该尺寸呈现。

为什么在渲染之前实际上需要大小?通常使用 Swing 编程,您不需要处理明确的尺寸/尺寸,因为所选布局会为您处理这些细节。

编辑

为了解决 OP 关于JTextField 的查询,这里的一个选项是调用基于int 的构造函数,该构造函数接受预期的列数。这会导致文本字段被渲染得足够宽以支持该数量的字符。

我的第二点是关于永远不应该直接调用 setXXXSize 方法并且开发人员应该完全依赖LayoutManager 的评论。这并不总是合适的 - 通常需要设置主应用程序框架的首选大小。例如,假设我正在用 Swing 编写一个简单的浏览器应用程序。主框架的大部分是JEditorPane,用于呈现 HTML。如果我没有为此组件(或包含框架)设置首选大小并调用pack(),则框架可能会被渲染得尽可能小,而不是合理的尺寸。

【讨论】:

  • 我将 Jlabel 放入其中并在其后放入文本,但我不知道该文本的大小...所以我想获取大小(不设置)。
  • 你可以试试getSize()或者getPreferedSize()
  • -1 nonono!永远不要在应用程序代码中使用任何 setXXSize 方法,而是使用像样的 LayoutManager。 +1 询问为什么问题:-)
  • @tiger - 请不要猜谜游戏。要么您知道要查询哪种方法(后者具有明显的后果;-)
  • 在组件级别上,它远非完全有效 - 相反,由于许多原因它几乎是完全错误的(参见 fi stackoverflow.com/questions/7229226/…) - 顶层框架,另一方面手,可以(并且经常)大小合适
【解决方案2】:

JComponents 不会返回 getSizegetLocationgetBoundsgetXxxSize,前提是之前在屏幕上或调用 pack() 后没有看到 JComponents

但是为什么要关心这个,因为使用(正确和正确的)LayoutManager 可以自动做到这一点,这就是为什么LayoutManager 存在在那里,真的为什么要关心这个

【讨论】:

    【解决方案3】:

    只需调用 JLabel 的 getPreferredSize 方法即可。无论它的容器是否未实现,如果您在设置 jlabel 的文本之前设置其可见,则首选大小会发生变化。

    【讨论】:

    • 我用同样的方式做,然后才看到答案:D 谢谢大家)))
    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多