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

时间:2009-05-02 16:26:08

标签: java swing

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

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

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

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

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

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

更新

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

4 个答案:

答案 0 :(得分:4)

我选择的解决方案实际上是查尔斯马林和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
}

答案 1 :(得分:3)

我想你想要WindowActivated。看看this part of the tutorial

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

程序如下:

  1. 创建一个新的JavaBean并让它实现LayoutManager(对于调色板支持也需要BeanInfo - 您可以通过右键单击bean类来创建一个)
  2. 构建项目
  3. 右键单击该bean并选择工具>添加到调色板... 并添加它
  4. 右键单击要为其设置布局的面板,然后选择设置布局>您的Bean名称
  5. 您可能会发现设计时体验有点缺乏。

    示例布局实现:

    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) {
        }
    }
    

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