【问题标题】:dynamically adding components and calling repaint/validate/revalidate动态添加组件并调用 repaint/validate/revalidate
【发布时间】:2013-06-14 02:38:13
【问题描述】:

我有一个主 JPanel、一个内部 JPanel 和一个用于内部 JPanel 的 JScrollPane

mainPanel = new JPanel();
innerPanel = new JPanel();
scroll = new JScrollPane(innerPanel);
scroll.setPreferredSize(new Dimension(400,300));
mainPanel.add(scroll);

我还在内部 JPanel 中动态添加组件

添加所有组件后,我在内部 JPanel 上调用 revalidate() 和 repaint()

当我从内部 JPanel 调用 removeAll() 组件时,我在内部 JPanel 上再次调用 revalidate() 和 repaint()

它工作正常,但我的困惑和问题是我是否应该在滚动上调用 revalidate() ,即:

scroll.getViewport().revalidate(); 

感谢您的任何反馈。

【问题讨论】:

  • 我认为不,因为它在面板内,但请等待专家:D

标签: java swing jpanel jscrollpane


【解决方案1】:

Swing 很聪明。你在你改变的组件上调用revalidate()

正如 API 所说:

换句话说,在调用此方法后,将验证在向上遍历此组件的包含层次结构时找到的第一个 validateRoot(如果有)。默认情况下,JRootPane、JScrollPane 和 JTextField 从 isValidateRoot 返回 true。

所以重新验证()滚动窗格将完成两次工作。

您可以重新验证()滚动窗格而不是面板,但是重新验证()面板更容易,因为您有对它的引用,因为您刚刚修改了它。

当您对方法有疑问时,请从 API 开始。如果您有不明白的地方,请引用 API 中的参考,以便我们提供帮助。

【讨论】:

  • 啊,谢谢。因此它会跟踪层次结构,并且只要您针对顶部容器内部组件,就会自动神奇地遍历
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 2010-11-09
  • 2011-09-08
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多