Panel im BorderLayout South wird nicht angezeigt

bluerob

Mitglied
Hallo Com,

ich habe das Problem, dass ein Panel, welches ich in ein anderes Panel eingefüge, welches das BorderLayout besitzt, nicht angezeigt wird.

Erst einmal der Aufbau:
Ich füge in ein JFrame ein JPanel mit BorderLayout ein.
Das Panel bekommt in die North-Postionen ein JPanel welches als menuBar dient.
Auf die West-Postion kommt ein weiteres Panel, genauso wie auf die East-Position.
Das East-Panel macht mir die Probleme. Der Name von dem Panel ist playerPanel.

Das playerPanel hat auch das BorderLayout. Damit die Center-Postion nicht lang gezogen wird (hier soll das playerListPanel rein), setzte ich in die North, East, South und West Positionen leere JPanels.
Es werden alle Panels, außer das in der South-Position angezeigt.

Ich hatte die Vermutung, dass es vielleicht daran liegt, dass das playerPanel unten aus dem Bildschirm herausgeht. Wenn man aber nachrechnet, stimmen alle Zahlen.

Ich hoffe ihr konnt mir helfen!

Java:
public void makePlayerField(){
        int playerFieldWidth = getWidth()/2;
        int playerFieldHeight = getHeight()-menuBarHeight;
        int playerFieldBorderLength = getWidth()/250;

        int playerListPanelWidth = 3*playerFieldWidth/4;
        int playerListPanelHeight = 6*playerFieldHeight/7;
        int playerListBorderLength = getWidth()/250;

        int playerFieldWidthSpace = playerFieldWidth-playerListPanelWidth;
        int playerFieldHeightSpace = playerFieldHeight-playerListPanelHeight;

        //PlayerField
        JPanel playerField = new JPanel();
        playerField.setBackground(Color.green);
        playerField.setLayout(new BorderLayout());
        playerField.setPreferredSize(new Dimension(playerFieldWidth, playerFieldHeight));
        playerField.setBorder(new MatteBorder(0,0,playerFieldBorderLength,playerFieldBorderLength,Color.BLACK));
        playerField.setOpaque(false);
        add(BorderLayout.EAST, playerField);

        //PlayerFieldSpacePanels
        JPanel playerFieldSpaceWest = new JPanel();
        playerFieldSpaceWest.setPreferredSize(new Dimension(playerFieldWidthSpace/2, 0));
        playerFieldSpaceWest.setBackground(Color.pink);
        playerField.add(BorderLayout.WEST, playerFieldSpaceWest);

        JPanel playerFieldSpaceEast = new JPanel();
        playerFieldSpaceEast.setPreferredSize(new Dimension(playerFieldWidthSpace/2, 0));
        playerFieldSpaceEast.setBackground(Color.pink);
        playerField.add(BorderLayout.EAST, playerFieldSpaceEast);

        JPanel playerFieldSpaceBottom = new JPanel();
        playerFieldSpaceBottom.setPreferredSize(new Dimension(0, playerFieldHeightSpace/2));
        playerFieldSpaceBottom.setBackground(Color.pink);
        playerField.add(BorderLayout.SOUTH, playerFieldSpaceBottom);

        JPanel playerFieldSpaceTop = new JPanel();
        playerFieldSpaceTop.setPreferredSize(new Dimension(0, playerFieldHeightSpace/2));
        playerFieldSpaceTop.setBackground(Color.pink);
        playerField.add(BorderLayout.NORTH, playerFieldSpaceBottom);

        //PlayerList
        JPanel playerListPanel = new JPanel();
        playerListPanel.setPreferredSize(new Dimension(playerListPanelWidth, playerListPanelHeight));
        playerListPanel.setBorder(new MatteBorder(playerListBorderLength, playerListBorderLength, playerListBorderLength, playerListBorderLength, Color.black));
        playerListPanel.setBackground(Color.red);
        playerField.add(BorderLayout.CENTER, playerListPanel);
    }
 
> JPanel playerFieldSpaceBottom = new JPanel();
> playerFieldSpaceBottom.setPreferredSize(new Dimension(0, playerFieldHeightSpace/2));
> playerFieldSpaceBottom.setBackground(Color.pink);
> playerField.add(BorderLayout.SOUTH, playerFieldSpaceBottom);

> JPanel playerFieldSpaceTop = new JPanel();
> playerFieldSpaceTop.setPreferredSize(new Dimension(0, playerFieldHeightSpace/2));
> playerFieldSpaceTop.setBackground(Color.pink);
> playerField.add(BorderLayout.NORTH, playerFieldSpaceBottom);


manchmal ist weniger mehr, eine Variable p, mehrmals verwendet, mit neuen Panel befüllt,

wann wird das eigentlich aufgerufen? vor setVisible(true) hoffentlich und dann sind Aufrufe a la getWidth() eher fraglich
 
Zuletzt bearbeitet von einem Moderator:
> JPanel playerFieldSpaceBottom = new JPanel();
> playerFieldSpaceBottom.setPreferredSize(new Dimension(0, playerFieldHeightSpace/2));
> playerFieldSpaceBottom.setBackground(Color.pink);
> playerField.add(BorderLayout.SOUTH, playerFieldSpaceBottom);

> JPanel playerFieldSpaceTop = new JPanel();
> playerFieldSpaceTop.setPreferredSize(new Dimension(0, playerFieldHeightSpace/2));
> playerFieldSpaceTop.setBackground(Color.pink);
> playerField.add(BorderLayout.NORTH, playerFieldSpaceBottom);

oh, hab vergessen, dass zurück zu ändern. hatte damit ausprobiert, ob es am panel liegt.
wenn ich das richtige Panel einfüge funktioniert es trotzdem nicht.

wann wird das eigentlich aufgerufen? vor setVisible(true) hoffentlich und dann sind Aufrufe a la getWidth() eher fraglich

mein JFrame mache ich zu FullScreenWindow. danach rufe ich eine methode generalOptions() auf, in welcher methoden für alle voreinstellungen aufgerufen werden, wie z.b. die, die ich gepostet habe.
 
ein vollständiges Testprogramm ist gerade bei GUI extrem wichtig, jede weitere Einstellung im Layout außen rum
kann Millionen Code-Zeilen obsolet machen

wenn die GUI nachträglich geändert wird, dann
validate();
repaint();
am JFrame aufrufen

> Es werden alle Panels, außer das in der South-Position angezeigt.
klingt allerdings weniger nach allgemeinen Problemen als genau einem spezifischen

da der Fehler auch bei mir zu sehen und dann genau zu entfernen war bin ich jetzt etwas ratlos,
so genau kann kaum was anderes schuld sein, oder meinst du mit
> wenn ich das richtige Panel einfüge funktioniert es trotzdem nicht.
einen anderen Fehler nun?

vielleicht hilft kompletter Code von dir,
hier ein vollständiges Testprogramm von mir, spasseshalber auch mit meinem p-Vorschlag,
und da bei mir am Anfang eingefügt ohne getWidth() & Co.

Java:
public class TestGUI
    extends JFrame
{
    public TestGUI()
    {
        makePlayerField();

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setVisible(true);
    }

    public void makePlayerField()
    {
        int playerFieldWidth = 200;
        int playerFieldHeight = 100;
        int playerFieldBorderLength = 5;

        int playerListPanelWidth = 3 * playerFieldWidth / 4;
        int playerListPanelHeight = 6 * playerFieldHeight / 7;
        int playerListBorderLength = 5;

        int playerFieldWidthSpace = playerFieldWidth - playerListPanelWidth;
        int playerFieldHeightSpace = playerFieldHeight - playerListPanelHeight;

        // PlayerField
        JPanel playerField = new JPanel();
        playerField.setBackground(Color.green);
        playerField.setLayout(new BorderLayout());
        playerField.setPreferredSize(new Dimension(playerFieldWidth, playerFieldHeight));
        playerField.setBorder(new MatteBorder(0, 0, playerFieldBorderLength, playerFieldBorderLength, Color.BLACK));
        playerField.setOpaque(false);
        add(BorderLayout.EAST, playerField);

        // PlayerFieldSpacePanels
        JPanel p = new JPanel();
        p.setPreferredSize(new Dimension(playerFieldWidthSpace / 2, 0));
        p.setBackground(Color.pink);
        playerField.add(BorderLayout.WEST, p);

        p= new JPanel();
        p.setPreferredSize(new Dimension(playerFieldWidthSpace / 2, 0));
        p.setBackground(Color.pink);
        playerField.add(BorderLayout.EAST, p);

        p = new JPanel();
        p.setPreferredSize(new Dimension(0, playerFieldHeightSpace / 2));
        p.setBackground(Color.pink);
        playerField.add(BorderLayout.SOUTH, p);

        p = new JPanel();
        p.setPreferredSize(new Dimension(0, playerFieldHeightSpace / 2));
        p.setBackground(Color.pink);
        playerField.add(BorderLayout.NORTH, p);

        // PlayerList
        JPanel playerListPanel = new JPanel();
        playerListPanel.setPreferredSize(new Dimension(playerListPanelWidth, playerListPanelHeight));
        playerListPanel.setBorder(new MatteBorder(playerListBorderLength, playerListBorderLength, playerListBorderLength,
                                                  playerListBorderLength, Color.black));
        playerListPanel.setBackground(Color.red);
        playerField.add(BorderLayout.CENTER, playerListPanel);
    }

    public static void main(String[] args)
    {
        new TestGUI();
    }

}
 
Wow, es liegt wirklich an dem getWidth(), bzw. getHeight();

Ich habe mein Programm jetzt so umgeschrieben, dass ich mein JFrame erst als FullScreenWindow setzte und danach meiner Klasse, in welcher alles gezeichnet wird, width und height von FullScreenWindow übergebe.
Die Methode benutzt dann die übermittelten Werte und alles klappt 🙂

Java:
public class LayoutPanel extends JPanel{

    private int windowWidth;
    private int windowHeight;

    public void makePlayerField(){
        int playerFieldWidth = windowWidth/2;
        int playerFieldHeight = windowHeight-menuBarHeight;
        int playerFieldBorderLength = windowWidth/250;

    ...
    }

aber warum ist es schlimm getWidth(), bzw. getHeight() zu benutzen?

Danke für deine Hilfe! 🙂
 
schau dir doch die abgefragten Werte an,
je nach Zeitpunkt, etwa vor setVisible(true)/ vor Einfügen eines Panel in laufende GUI, ist noch nichts zu sehen, ergo gibts keine width usw.
 

Zurück
Oben