JPanel verkleinert sich, wenn man das Fenster vergrößert

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hi,
ich möchte ein kleines Grafikprogramm erstellen. Bis jetzt kann man unter "Datei" --> "Neues Projekt" ein JPanel gewünschter Größe erstellen.
Das Problem ist nun, dass dieser JPanel zu einem Punkt von vielleicht 5 x 5 Pixeln schrumpft, wenn man das Fenster vergrößert (zumindest unter Mac OS X).

Weiß vielleicht jemand, woran das liegt?

Hier der komplette Quellcode (Bin für jeden Verbesserungsvorschlag des Designs dankbar!)

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

public class Window extends JFrame{
	
	private JFrame jfNewProject = new JFrame("Neues Projekt"); //Window to set up the id card.
	
	private JPanel contentPane = new JPanel(); // Here you add Window-Components
	
	private JMenuBar menuBar = new JMenuBar(); 
	private JMenu fileMenu = new JMenu( "Datei" );
	private JMenuItem newProject = new JMenuItem("Neues Projekt");
	
	private JPanel idCard = new JPanel();
	
	private int widthIDCard;
	private int heightIDCard;
	
	public Window(){
		super("Ausweis-Ersteller"); //Titel
		
		contentPane.setBackground(Color.GRAY);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Programm exits on pressing Exit-Button
			
		this.setContentPane(contentPane); //Setting contentpane
		
		this.setMenu();
	    
	    this.setSize(700, 700);
	    this.setVisible( true );
	    
	}
	
	private void setMenu(){
		this.setJMenuBar( menuBar );
		
		menuBar.add( fileMenu ); 
		fileMenu.add(newProject);    
	    
	    newProject.addActionListener(new AbstractAction(){
	    	public void actionPerformed(ActionEvent e){
	    		newProject();
	    	}
	    });
	}
	
	private void newProject(){
		
		JPanel contentPane2 = new JPanel();
		jfNewProject.setContentPane(contentPane2);
		
		JLabel jlWidth = new JLabel("Breite in Pixel");
		JLabel jlHeight= new JLabel("Höhe in Pixel");
		
		JButton jbOK = new JButton("OK");
		JButton jbCancel = new JButton("Abbrechen");
		
		final JTextField jtfWidth = new JTextField(5);
		final JTextField jtfHeight = new JTextField(5);
		
		contentPane2.add(jlWidth);
		contentPane2.add(jtfWidth);
		contentPane2.add(jlHeight);
		contentPane2.add(jtfHeight);
		contentPane2.add(jbOK);
		contentPane2.add(jbCancel);
		
		jfNewProject.setSize(200, 200);
		jfNewProject.setVisible( true );
		
		jbOK.addActionListener(new AbstractAction(){
	    	public void actionPerformed(ActionEvent e){
	    		
	    		widthIDCard = Integer.parseInt(jtfWidth.getText());
	    		heightIDCard = Integer.parseInt(jtfHeight.getText());
	    		idCard.setSize(widthIDCard, heightIDCard);
	    		idCard.setBackground(Color.white);
	    		
	    		
	    		
	    		contentPane.add(idCard);
	    		
	    		repaintWindow();
	    		
	    		jfNewProject.dispose();
	    	}
	    });
		
		jbCancel.addActionListener(new AbstractAction(){
	    	public void actionPerformed(ActionEvent e){
	    		jfNewProject.dispose();
	    	}
	    });
	}
	
	private void repaintWindow(){
		this.repaint();
	}
	
}

Code:
public class IdentifierBuilder {
	
	public void IdentifierBuilder(){

	}
	
	public static void main(String args[]){
		IdentifierBuilder idBuilder = new IdentifierBuilder();
		Window window = new Window();
	}
}

Liebe Grüße
Reality
 
das neue JPanel würde eigentlich sofort sehr klein dargestellt werden,
wenn du mit validate() das Layout neu berechnen lassen würdest,
wie es bei einer Größenänderung passiert,

setSize() hat beim BorderLayout nicht so viel zu sagen,
setPrefererredSize() bringt dagegen was
 
Hi SlaterB,
danke für deine Antwort.
Mit idCard.setPreferredSize(new Dimension( widthIDCard, heightIDCard )); tut sich jedoch nun gar nichts mehr. :-(

Was nu?

Liebe Grüße
Reality
 
wie ich geschrieben habe:

private void repaintWindow(){
this.validate();

this.repaint(); // wohl unnötig
}
 
Hi SlaterB!
Danke, jetzt funktioniert es!
Ich verstehe jedoch nicht, weshalb das nun mit validate() funktioniert, da ich es ja nur EINMAL aufrufe und zumindest von mir nicht mehr aufgerufen wird, wenn ich das Fenster vergrößere.

Liebe Grüße
Reality
 
Noch eine Frage: Der Unterschied zwischen setSize und setPreferredSize wird in der API nicht sonderlich hervorgehoben. Preferred heißt ja nichts anderes als "bevorzugen". Wieso ändert sich jedoch die Größe bei setSize trotzdem, auch wenn ich explizit die Größe angebe und bei setPreferredSize nicht?!

Liebe Grüße
Reality
 
Sowohl beim Verändern der Fenstergrösse mit der Maus als auch bei "contentPane.revalidate()"
tritt der LayoutManager in Aktion, hier FlowLayout. FlowLayout setzt die Grösse seiner
Komponenten gemäss der PreferredSize.
Wenn du jedoch setSize machst ohne "contentPane.revalidate()", dann
wird der LayoutManager umgangen und die Grösse direkt gesetzt (nicht empfohlen).
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben