可以使用什么Java Swing事件来了解应用程序何时启动?

我正在寻找一个地方来挂钩一些代码,以便在应用程序加载完成后以编程方式创建,resize和定位JPanel。

我刚开始使用Java。 我正在使用带有jdk1.6.0_13的NetBeans 6.5.1。 我已经使用新项目向导来创建基本的Java / Swing桌面应用程序。 这是一个SingleFrameApplication,它使用带有中央主要JPanel的FrameView,其中放置了所有UI元素。

我首先在FrameView构造函数中尝试了我的代码但是当我尝试根据我添加到UI中的一个设计时控件的边界矩形来安排我的JPanel时,该控件还没有完成定位和resize所以我得到了全部为坐标的零。

我已经validation了我的代码按照预期通过在应用程序加载后从单击事件中调用它来工作,所以我的问题是找到一种方法来了解何时完成所有内容的大小和排列。

我还尝试了来自主JPanel的componentShown事件,但我后来读到只有在显式调用setVisible时才会触发,这在正常的应用程序启动过程中显然不会发生。

任何人都可以提供一些指示吗? 谢谢。

更新:

除了我在下面的回答中提到的内容之外,我还阅读了Application.ready()方法。 这也是知道应用程序的UI部分何时完成它需要做的所有事情的兴趣点。 从应用程序传达我的观点似乎有点混乱。

我采用的解决方案实际上是查尔斯马林和JRL的答案的组合(我赞同你的两个信用答案,谢谢)。

我有我的FrameView类实现WindowListener。

... public class MyView extends FrameView implements WindowListener ... 

在我的FrameView构造函数中,我向应用程序的主框架添加了一个监听器。

 ... getFrame().addWindowListener((WindowListener) this); ... 

然后在我的windowActivated实现中,我可以根据其他控件的位置和大小调用我必须安排的代码并在主JPanel上调整控件的大小。

 public void windowActivated(WindowEvent e) { // The application should now be finished doing its startup stuff. // Position and size a control based on other UI controls here } 

你想要WindowActivated。 看看本教程的这一部分 。

我尝试使用getFrame().isValid()

我认为这是WYSIWYG编辑器的事情。 我正在研究NetBeans 6.1,因此您的体验可能会有所不同。

布局Swing组件的传统方法是使用LayoutManager (或LayoutManager2 )。 根据NetBeans的帮助,可视化编辑器支持这些,只要它们不需要支持约束。

程序如下:

  1. 创建一个新的JavaBean并让它实现LayoutManager(对于调色板支持也需要BeanInfo – 您可以通过右键单击bean类来创建一个)
  2. 建立项目
  3. 右键单击该bean,然后选择“ 工具”>“添加到调色板…”并添加它
  4. 右键单击要为其设置布局的面板,然后选择“ 设置布局”>“您的Bean名称”

您可能会发现设计时体验有点缺乏。

示例布局实现:

 public class StepLayoutBean extends Object implements Serializable, LayoutManager { public void addLayoutComponent(String name, Component component) { } public void layoutContainer(Container container) { Dimension space = container.getSize(); int xoffset = 0; int yoffset = 0; for (Component kid : container.getComponents()) { Dimension prefSize = kid.getPreferredSize(); if (prefSize.width + xoffset > space.width) { xoffset = 0; } Rectangle bounds = new Rectangle(xoffset, yoffset, prefSize.width, prefSize.height); kid.setBounds(bounds); xoffset += prefSize.width; yoffset += prefSize.height; } } public Dimension minimumLayoutSize(Container container) { Dimension size = new Dimension(); for (Component kid : container.getComponents()) { Dimension minSize = kid.getMinimumSize(); size.width = minSize.width > size.width ? minSize.width : size.width; size.height += minSize.height; } return size; } public Dimension preferredLayoutSize(Container container) { Dimension size = new Dimension(); for (Component kid : container.getComponents()) { Dimension prefSize = kid.getPreferredSize(); size.width += prefSize.width; size.height += prefSize.height; } return size; } public void removeLayoutComponent(Component component) { } } 

如果自定义布局不符合条件,请查看组件属性面板下的事件绑定 – 尽管resize可能会导致某种递归事件风暴。