Макет Java JFrame - PullRequest
       6

Макет Java JFrame

0 голосов
/ 13 октября 2010

Это проблема, у меня есть класс MainWindow, который расширяет JFrame в одной из процедур установки. Я установил макет класса на новый CardLayout ().Это все работает нормально, но когда я иду, чтобы запросить макет из JFrame и привести то, что он возвращает к CardLayout, я получаю ошибки, потому что он возвращает BorderLayout.Я думаю, что вы получаете изображение из слуха.

Пожалуйста, найдите код ниже:

public MainWindow()
{
    initWindow();
}

public void actionPerformed(ActionEvent e)
{
    CardLayout m = (CardLayout)super.getLayout();
    m.next(this);
}

private void initWindow()
{
    super.getContentPane().setLayout(_mainLayout);
    super.setTitle(_WINDOW_NAME);
    super.setSize(_DEFAULT_WINDOW_SIZE);
    super.setLocationRelativeTo(null);
    super.setAlwaysOnTop(true);
    super.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    super.setResizable(false);

    init_buttons_panel();
    super.add(_buttons_panel, "bpanel");
}

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

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

Ответы [ 3 ]

1 голос
/ 13 октября 2010
super.getContentPane().setLayout(_mainLayout); 

Код, который вы разместили, не помогает нам, так как у нас нет всей информации. Мы не знаем, на что ссылается переменная _mainLayout.

Я предлагаю вам начать с прочтения раздела из учебника по Swing Как использовать макет карты для рабочего примера и лучше разработанной программы. Во-первых, нет причин расширять JFrame, поскольку вы не добавили никакой функциональности.

1 голос
/ 13 октября 2010

Во-первых, вы не должны использовать такой макет, по крайней мере, без каких-либо проверок.Сначала вы должны использовать ключевое слово instanceof, чтобы проверить, действительно ли это CardLayout, чтобы предотвратить внезапное завершение программы.

Во-вторых, проблема здесь:

public void actionPerformed(ActionEvent e)
{
    CardLayout m = (CardLayout)super.getContentPane().getLayout();
    m.next(this);
}

В основномвы получали макет JFrame, а не с панели содержимого JFrame, которую вы фактически задали как CardLayout.

0 голосов
/ 13 октября 2010

Метод getLayout JFrame наследуется от Container и, следовательно, не перенаправляет вызов в область содержимого JFrame. Вы можете попробовать использовать super.getContentPane().getLayout() вместо super.getLayout().

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