BorderLayout JPanel größe nicht identisch

Hallo Leute,

ich habe ein Problem mit dem BoderLayout.
Ich habe ein JFrame-Fenster wie das auf dem Foto.
Link: https://wiki.byte-welt.net/wiki/Datei:BorderLayout.png
Auf diesem platziere ich drei JPanels: east, west & center.

Der einzige Unterschied zu meinem Fenster ist, das ich den oberen und den unteren Button nicht habe.
Nun wollte ich die Größe von East und West mit 93 festlegen:

east.setPreferredSize(new Dimension(93, 0));
west.setPreferredSize(new Dimension(93, 0));

Leider ist “east” immer größer als “west”.
“east” deckt sogar einen Teil von “center” ab??

center hat eine Länge von: 750.
east + west haben zusammen: 186.
Das Hauptfenster (JFrame) hat 936 in der Länge.
Von der Größe her müsste alles passen, tut es aber leider nicht.

Verstehe das nicht.
Ich habe schon so oft mit dem BorderLayout gearbeitet und bis jetzt hat eigentlich
alles funktioniert.

Was mache ich Falsch?

SG

Hmm… ist der Frame resizeable? Falls nicht, könnte es an dem z.B. unter Windows auftretenden Fehler liegen, durch welchen non resizable Frames kleiner dargestellt werden, als sie sein sollten. Sonst hätte ich auch keine Idee.

Das JFrame ist nicht resizeable.
Habe es jetzt mal auf ture gesetzt, hat aber nichts gebracht.

Das center Fenster ist ein JPanel auf dem mit einem array Buttons platziert werden mit einer größe von 50*50.

Hier scheint der Fehler zu sein.

Ohne Code kann man hier schlecht sagen, was falsch läuft. Vielleicht kannst du aus folgenden Zeilen etwas für dich entnehmen.

import java.awt.*;
import javax.swing.*;

public class StandardFrame {
   public StandardFrame() {
      Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
      JFrame frame = new JFrame("BorderLayout-Demo");
      frame.add(new AsidePanel(), BorderLayout.WEST);
      frame.add(new AsidePanel(), BorderLayout.EAST);
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.setSize(size.width * 50 / 100, size.height * 50 / 100);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      } catch(Exception e) {
         System.err.println(e);
      }

      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            new StandardFrame();
         }
      });
   }

   class AsidePanel extends JPanel {
      AsidePanel() {
         super();
         setBackground(Color.ORANGE);
      }

      public Dimension getPreferredSize() {
         return new Dimension(93, 0);
      }
   }
}

Danke für den Source.

Meiner müsste eigentlich auch funktionieren:

        JFrame frame = new JFrame();
	JPanel panel = new JPanel();
	
	frame.setTitle("Test-Fenster");
	frame.setUndecorated(false);
	frame.setLayout(null);
	frame.setSize(930, 650);
	frame.setResizable(false);
	
	panel.setBounds(115, 40, 700, 400); 
	panel.setBackground(Color.BLUE);
	panel.setLayout(null);
	
	frame.add(panel);
	
	frame.setVisible(true);

Hier habe ich einfach die 930(frame) - 700(panel) = 230
Die 230 / 2 = 115.
Das heißt, dass panel hat die x-pos: 115.
Somit müsste das panel mittig im frame sitzen (nur auf der x-Achse).
Leider ist es aber nicht mittig (Siehe Bild).
Man sieht das mit freien Auge.

Was hat dein Code mit einem BorderLayout-Problem zu tun? Du hast die LayoutManager ausgeschaltet.
“NullLayout” ist zu 99% die falsche Wahl, wenn es um die Konstruktion von GUIs geht.

Das weiß ich ich.
Ich habe es nur mal zum Testzweck geändert und es funktioniert ebenfalls nicht.
Es ist beim BorderLayout & NullLayout das selbe Problem vorhanden, warum??

Kann ich mir nicht vorstellen. Schreibe mal bitte ein KSKB mit BorderLayout, dann schauen wir mal.

Hat dieser Source bei euch funktioniert?
Ist bei euch das JPanel in der Mitte?

Auch wenn ich hier das NullLayout verwendet habe, müsste das JPanel genau in mittig in xpos sein.

was soll man in dem Bild erkennen, dass links ein paar Pixel weniger Abstand zum Rand sind als rechts?
deine bloßen Augen sind ja jedem zu wünschen…

panel.setBounds(5, 40, 920, 400);

ist deutlicher

930 ist die Außenlänge des JFrames, das hat aber auch einen Border,
außerdem gibt es JFrame + dessen ContentPane mit evtl. Abständen,
jede Komponente hat auch leicht einen gewissen Anstandsabstand…,

Reibungsverluste gehören dazu,
wenn man pixelgenau arbeiten will, dann eine Zeichenfläche festlegen und wirklich jeden Pixel, Linie, Rahmen darin selber setzen


zu deinem BorderLayout vom Anfang fehlt nun immer noch fatal das Testprogramm…,
möglich dass PreferredSize nicht alles ist, Size je nach Inhalt gesetzt wird,

wobei in meinem Test ein breiter Button ignoriert wird, leicht erstaunlich für mich,
mit gleicher Größe links und rechts sieht es in meinem Beispiel zumindest ganz gut aus

		JFrame frame = new JFrame();

		frame.setTitle("Test-Fenster");
		frame.setUndecorated(false);
		frame.setLayout(new BorderLayout());
		frame.setSize(936, 650);
		frame.setResizable(false);
		
		String refString = "IIIIIIIIIIIIIIIIIII";
		JPanel east = new JPanel();
		east.setPreferredSize(new Dimension(93, 0));
		east.setBackground(Color.BLUE);
		east.add(new JButton(refString));
		east.add(new JButton("langer Text langer Text langer Text langer Text "));

		JPanel west = new JPanel();
		west.setPreferredSize(new Dimension(93, 0));
		west.add(new JButton(refString));
		west.setBackground(Color.GREEN);
		
		JPanel center = new JPanel();
		center.setPreferredSize(new Dimension(750, 0));
		center.setBackground(Color.YELLOW);

		frame.add(east,BorderLayout.EAST);
		frame.add(west,BorderLayout.WEST);
		frame.add(center,BorderLayout.CENTER);

		frame.setVisible(true);