Добавление JPanel в JFrame

У меня есть программа, в которой JPanel добавляется в JFrame:

public class Test{

    Test2 test = new Test2();
    JFrame frame = new JFrame();

    Test(){

    ...
    frame.setLayout(new BorderLayout());
    frame.add(test, BorderLayout.CENTER);
    ...

    }

    //main

    ...

    }

    public class Test2{

    JPanel test2 = new JPanel();

    Test2(){

    ...

    }

}

Я получаю сообщение об ошибке с просьбой изменить тип «панели» на «компонент». мне исправить эту ошибку? Он хочет, чтобы я сделал: Component panel = new Component();


person Anonymous181    schedule 04.05.2012    source источник
comment
Вам нужно опубликовать больше кода, так как то, что вы опубликовали, должно просто работать   -  person Robin    schedule 04.05.2012
comment
JPanel является компонентом. Код, который вы только что вставили, дает вам эту ошибку?   -  person Charles    schedule 04.05.2012
comment
Похоже, вы неправильно интерпретируете сообщение об ошибке; какое точное сообщение об ошибке?   -  person rob    schedule 04.05.2012


Ответы (5)


сделай это просто

public class Test{
    public Test(){
        design();
    }//end Test()

public void design(){
    JFame f = new JFrame();
    f.setSize(int w, int h);
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.setVisible(true);
    JPanel p = new JPanel(); 
    f.getContentPane().add(p);
}

public static void main(String[] args){
     EventQueue.invokeLater(new Runnable(){
     public void run(){
         try{
             new Test();
         }catch(Exception e){
             e.printStackTrace();
         }

 }
         );
}

}
person sabbibJAVA    schedule 28.07.2012

Вместо того, чтобы ваш класс Test2 содержал JPanel, вы должны иметь его подкласс JPanel:

public class Test2 extends JPanel {

Test2(){

...

}

Подробнее:

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

Старые версии не позволяли добавлять непосредственно в JFrame; вам пришлось использовать JFrame.getContentPane().add(Component). Если вы используете более старую версию, это также может быть проблемой. Более новые версии Java позволяют напрямую вызывать JFrame.add(Component).

person rob    schedule 04.05.2012

Test2 test = new Test2();
...
frame.add(test, BorderLayout.CENTER);

Вы уверены в этом? test НЕ является компонентом! Чтобы сделать то, что вы пытаетесь сделать, вы должны позволить Test2 расширить JPanel !

person StepTNT    schedule 04.05.2012

Ваш класс Test2 не является классом Component, у него есть класс Component, который является отличием.

Либо вы делаете что-то вроде

frame.add(test.getPanel() );

после того, как вы ввели геттер для панели в свой класс или убедитесь, что ваш класс Test2 становится Component (например, расширяя JPanel)

person Robin    schedule 04.05.2012

person    schedule
comment
Любопытно, есть ли причина, по которой вы не расширили JFrame непосредственно в Test? Я всегда так делаю, может это плохая привычка? Проголосовал. - person Jean-François Savard; 18.04.2015
comment
@Jean-FrançoisSavard Я не добавляю никаких функций и не изменяю какие-либо существующие функции фрейма, поэтому я просто использую простой экземпляр. Как правило, разработчики графического интерфейса поощряют расширение фреймов или панелей (без веской причины, насколько я понимаю). - person Andrew Thompson; 18.04.2015
comment
Ну, это имеет смысл, спасибо за быстрый ответ. - person Jean-François Savard; 18.04.2015
comment
После переосмысления, не упрощается ли расширение JFrame, чтобы вам не приходилось указывать переменную каждый раз, когда вы хотите вызвать методы фрейма? Не говоря уже о том, что расширение позволяет передавать параметры непосредственно родительскому конструктору. Или, возможно, это просто вопрос мнения, я не нашел соответствующей информации по этому поводу в спецификациях свинга. - person Jean-François Savard; 18.04.2015
comment
@Jean-FrançoisSavard расширение позволяет передавать параметры непосредственно в родительский конструктор. Как только вы это сделаете, вы измените функциональность фрейма. ;) - person Andrew Thompson; 18.04.2015
comment
Это правда. Если я понимаю, что вы мне говорите, необходимость внесения каких-либо изменений (например, установка заголовка) перенаправит вас к расширению JFrame ? И причина, по которой вы не расширили этот пример, заключалась только в том, что этот пример не изменяет ни одного простого свойства? - person Jean-François Savard; 18.04.2015
comment
@Jean-FrançoisSavard необходимость внесения каких-либо изменений (например, установка заголовка) перенаправит вас на расширение JFrame? Обычно я передаю заголовок в конструкторе. НАПРИМЕР. как в этом примере. Также обратите внимание, что в примере используется метод для настройки и построения панели ui, опять же, а не для ее расширения. Я действительно предпочитаю не расширять, если не делаю что-то вроде пользовательской живописи. - person Andrew Thompson; 18.04.2015