Какое событие Java Swing можно использовать, чтобы узнать, когда приложение завершило запуск? - PullRequest
6 голосов
/ 02 мая 2009

Я ищу место для перехвата некоторого кода для программного создания, определения размера и позиционирования JPanel после завершения загрузки приложения.

Я только начинаю с Java. Я использую NetBeans 6.5.1 с jdk1.6.0_13. Я использовал мастер нового проекта для создания базового настольного Java / Swing-приложения. Это приложение SingleFrameApplication, которое использует FrameView с центральной главной JPanel, в которой размещены все элементы пользовательского интерфейса.

Сначала я попробовал свой код в конструкторе FrameView, но когда я пытаюсь расположить свою JPanel на основе ограничивающего прямоугольника одного из элементов управления временем разработки, который я добавил в пользовательский интерфейс, этот элемент управления еще не закончил позиционирование и размер, поэтому получаю все нули по координатам.

Я подтвердил, что мой код работает, как и ожидалось, вызвав его из события щелчка после загрузки приложения, поэтому моя проблема заключается в том, чтобы найти способ узнать, когда все закончится, размер и расположение.

Я также попробовал событие componentShown из основного JPanel, но позже прочитал, что оно запускается только при явном вызове setVisible, что, по-видимому, не происходит при обычном запуске приложения.

Кто-нибудь может дать несколько указателей? Спасибо.

Обновление:

Помимо того, что я упоминаю в своем ответе ниже, я также читал о методе Application.ready (). Это также было бы интересным моментом для того, чтобы знать, когда часть пользовательского интерфейса приложения выполняет все, что ему нужно. Общение, на мой взгляд, из приложения казалось немного грязным.

Ответы [ 4 ]

4 голосов
/ 02 мая 2009

Решение, с которым я столкнулся, было на самом деле сочетанием ответов Чарльза Марина и JRL (я одобрил оба ваших ответа за кредит, спасибо).

У меня был класс FrameView, реализующий WindowListener.

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

и в конструкторе FrameView я добавил прослушиватель в основной фрейм приложения.

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

Тогда в моей реализации windowActivation я мог вызвать код, который мне пришлось упорядочить, и задать размер элемента управления на главной 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
}
3 голосов
/ 02 мая 2009

Я думаю, вы хотите WindowAcactive. Взгляните на эту часть урока .

1 голос
/ 02 мая 2009

Я предполагаю, что это редактор WYSIWYG. Я смотрю на NetBeans 6.1, поэтому ваш опыт может отличаться.

Традиционный способ размещения компонентов Swing заключается в использовании LayoutManager (или LayoutManager2 ). Согласно справке NetBeans, визуальный редактор поддерживает их, если им не требуется поддержка ограничений.

Процедура выглядит примерно так:

  1. Создайте новый JavaBean-компонент и реализуйте в нем LayoutManager (BeanInfo также необходим для поддержки палитры - вы можете создать его, щелкнув правой кнопкой мыши по классу bean-компонента)
  2. Сборка проекта
  3. Щелкните правой кнопкой мыши по компоненту и выберите Инструменты> Добавить в палитру ... и добавьте его
  4. Щелкните правой кнопкой мыши панель, для которой вы хотите установить макет, и выберите Установить макет> Имя вашего бина

Возможно, вам пока не хватает опыта разработки.

Пример реализации макета:

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

Если пользовательский макет не соответствует требованиям, взгляните на привязки событий под панелью свойств компонента - хотя изменение размера таким способом может стать рецептом для некоторого рекурсивного шторма событий.

1 голос
/ 02 мая 2009

Я бы попробовал использовать getFrame().isValid()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...