Komponenten andordnen

  • Themenstarter Themenstarter Joe1243
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

Joe1243

Gast
Mein Problem ist, dass ich jedesmal ein rießen Problem damit habe die Panel und auch die anderen Komponenten so anzuordnen, wie ich es mir vorstelle. Der untere Code zum Beispiel: Ich möchte nur dieses grün gefärbte JPanel in die Mitte ContentPanes setzen, jedoch nimmt das JPanel, egal was ich mache, jedesmal das ganze Frame ein. Was mache ich falsch? bzw. wie kann ich meine Komponenten in der Größe anordnen wie ich sie angebe?

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Painting extends JFrame{
	JPanel surface;
	
	public Painting(String title){
		super(title);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(600,400);
		setPreferredSize(new Dimension(600,400));
		Toolkit kit = Toolkit.getDefaultToolkit();
		setLocation(kit.getScreenSize().width/2-getSize().width/2,
			kit.getScreenSize().height/2-getSize().height/2);
		getContentPane().setLayout(new BorderLayout());
		surface = new JPanel();
		surface.setBackground(Color.green);
		surface.setPreferredSize(new Dimension(100,100));
		getContentPane().add(surface, BorderLayout.CENTER);
		pack();
		setVisible(true);
	}
	
	public static void main(String[] args){
		Painting painting = new Painting("Paint");
	}
}
 
Man gibt dem Fenster selber niemals irgendwelche Grössen, sondern nur den einzelnen Komponenten.
Das Fenster kriegt dann nur ein Layout und man addet die Dinge dementsprechend.
pack() checkt auf allen Komponenten, die geaddet wurden, ihre PreferredSize und baut das Fenster
dementsprechend zusammen.Ein

Code:
setLocationRelativeTo(null);

nach dem pack() Aufruf zentriert dir übrigens das Fenster auf dem Bildschirm, d.h. du kannst dir das
mit Toolkit und setLocation auch sparen.

Wenn du das jetzt so machst würdest du aber weiterhin nur ein 100*100 grosses Fenster mit dem grünen
Panel kriegen, ganz einfach weil das das einzige ist, was du geaddet hast.
Du könntest jetzt links, rechts, oben und unten noch weisse Panels adden, um das grüne Panel nur in der Mitte
zu haben.

Man sollte sich aber immer überlegen ob sowas Sinn macht, ich meine wofür willst du ein Panel in der Mitte von
nichts? Dann lass das nichts doch einfach weg.

Ansonsten, aber das solltest du dir nicht angewöhnen, kannst du per Hand Dinge einfach so adden:

Code:
setLayout(null); // wie gesagt, vergiss das lieber wieder gleich...
setSize(400,400); // auch schlecht, hab ich ja vorhin gesagt
JPanel panel = new JPanel();
panel.setBounds(150,150,100,100); // so macht man das dann wenn man ein "null"-Layout hat
// d.h.: obere linke Ecke bei (150,150) und 100 breit, 100 hoch
add(panel);
 
Auch für so 'ne Sachen brauchst du dich nicht mit NullLayout abzugeben. Das geht gaaanz einfach mit GridBagLayout.
...und alles bleibt flexibel. 😉
Code:
import java.awt.*;
import javax.swing.*;

public class Painting extends JFrame {
   private JPanel surface;

   public Painting(String title){
      super(title);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setPreferredSize(new Dimension(600, 400));
      
      JPanel intern = new JPanel(new GridBagLayout());
      
      surface = new JPanel();
      surface.setBackground(Color.green);
      surface.setPreferredSize(new Dimension(100, 100));
      intern.add(surface);
      
      getContentPane().add(intern, BorderLayout.CENTER);
      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

   public static void main(String[] args){
      Painting painting = new Painting("Paint");
   }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben