JPanel toevoegen aan JFrame

Ik heb een programma waarin een JPanel wordt toegevoegd aan een 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(){
    ...
    }
}

Ik krijg een foutmelding waarin ik wordt gevraagd het type ‘paneel’ te wijzigen in ‘component’. Ik repareer deze fout?
Het wil dat ik het volgende doe: Componentenpaneel = nieuwe Component();


Antwoord 1, autoriteit 100%

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{
public class Test2 extends JPanel {
//JPanel test2 = new JPanel();
Test2(){
...
}

Antwoord 2, autoriteit 20%

doe het eenvoudig

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();
         }
 }
         );
}
}

Antwoord 3, autoriteit 7%

In plaats van dat uw Test2-klasse een JPanel bevat, zou u deze een subklasse JPanel moeten hebben:

public class Test2 extends JPanel {
Test2(){
...
}

Meer details:

JPanelis een subklasse van Component , dus elke methode die een Component als argument neemt, kan ook een JPanel als argument nemen.

Oudere versies lieten je niet direct toevoegen aan een JFrame; je moest JFrame.getContentPane().add(Component) gebruiken. Als u een oudere versie gebruikt, kan dit ook een probleem zijn. Met nieuwere versies van Java kunt u JFrame.add(Component) rechtstreeks aanroepen.


Antwoord 4

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

Weet je dit zeker? testis GEEN onderdeel!
Om te doen wat u probeert te doen, moet u Test2JPanellaten uitbreiden!


Antwoord 5

Uw klasse Test2is geen Component, het heeft een Component, wat een verschil is.

Of je doet iets als

frame.add(test.getPanel() );

nadat je een getter voor het panel in je klas hebt geïntroduceerd, of je zorgt ervoor dat je Test2-klas een Componentwordt (bijvoorbeeld door een JPanel)

Other episodes