JFrame Größe an Inhalt anpassen

screaper

Mitglied
Wie kann ich die Größes des JFrames zur Laufzeit ändern?

Es handelt sich um eine Anwenung, die zu beginn eine feste defaultgröße hat.
Dann wird ein JPanel eingefügt, dass seine Größe zur Laufzeit ändert.
Wie kann ich nun den JFrame immer passend um das eingefügte Panel platzieren?

Gruß Screaper
 
Hm. Vielleicht so.

JFrame.setSize(JFrame.getWidth + JPanel.getWidth, JFrame.getHeight + JPanel.getHeight)

Wobei JPanel immer das neue Panel ist.

Gruß
Chris
 
Hi,

ich will aber nicht die Größe des Frames+Japnel, sondern ich ich habe anfangs anfangs einen Defaultwert, damit man das JFrame und das Menü auch sieht.
Sagen wir mal 600*400. Die Addidtion bringt hier also nix.

Ich hatte auch schon versucht: JFrame.setSize(JPanel.getWidth()..., ...getHeight());

und anschließend ein repaint(). Aber es geht auch nciht. Die größe ändert sich nicht.
 
Hallo,

wäre es möglich, dass du den Code mal postest?
SetSize ist der richtige Ansatz.

Gruß

Sascha
 
Ja muss ich mal schauen, bin grand nicht zu hause.

Hier mein Ansatz mit pseudocode:

class Panel {

public Panel(Boolean b, Main m){ //Ich übergebe eine Referenz auf das JFrame, indem es geadded wurde.

im Konstruktor kommt dann folgedner Code
m.setSize(this.getwidth(), this.getHeight());
m.repaint();
}
}


class Main extends JFrame{

setSizeOfFrame(new Dimension (600,400); (Damit ich eine initiale Größe habe !?)

panel = new Panel(true, this);
this.getContentPane().add(panel);
this.pack();
getContentPane().repaint();
this.setSizeOfFrame();
}


Kann es sein, dass meine Größenfeldlegung in der Klasse Main,die gesetzte Größe vom Konstruktor meines Panels wieder überschreibt?

Gruß Screaper
 
Erstmal, wenn du pack() benutzt, brauchst du dem Fenster keine Größe zu setzen, da sich das Fenster der Größe der hinzugefügten Komponenten anpasst.

Wenn du dem Panel eine Größe setzen möchtest, wenn ein LayoutManager genutzt wird, musst du die Methode setPreferredSize nutzen.

Könntest du mal den kompletten Code zeigen?

Gruß

Sascha
 
Hi hier der Code,

ich musste ihn aus diversen Klassen extrahieren. Ich hoffe die Übersichtlichkeit ist noch gegeben....

Hier das JPanels, das in das Frame eingefügt wird (den ganzen Code kann ich nicht posten, da die Klasse knapp 280 Zeilen hat).

Java:
public Cascade(boolean b, Main m){
		
		if(b){
		this.m=m;
			initComponents();
		initConfig();
		repaint();
		}
		
	}//End Construktor

private void initComponents(){
				
		leftSidePanel.setLayout(new FlowLayout());
		rightSidePanel.setLayout(new BorderLayout());
		this.setLayout(new BorderLayout());
		modeSwitch.setEnabled(false);
		switchStones.setEnabled(false);
				
		leftSidePanel.add(playerALabel);
		leftSidePanel.add(switchStones);
		leftSidePanel.add(modeSwitch);
		leftSidePanel.add(playerBLabel);
		
			
		switchStones.addActionListener(this);
		modeSwitch.addActionListener(this);
		
		playerALabel.setBackground(CLIENTBOWL);
		playerBLabel.setBackground(SPIELFELDCOLOR);
				
		this.add(leftSidePanel, BorderLayout.NORTH);
		this.add(rightSidePanel, BorderLayout.CENTER);
	
		this.setVisible(true);
	}

	private void initConfig(){
		
		if (m.readConfigDialogFromMain()!=null){
			
		configDialog = m.readConfigDialogFromMain();
		}
		else{
		configDialog = new ConfigDialog(m);		
		}
		configDialog.setModal(true);
		configDialog.setVisible(true);
		modeSwitch.setEnabled(true);
		switchStones.setEnabled(true);
		
		
		this.getSizeOfField();
		
		this.maxSwitchAvailable = configDialog.getMaxSwitch();
	
		this.beginner = configDialog.getBeginner();
		this.getPlayerLabels();	
		this.setPlayMode(configDialog.getPlayMode());
		m.setSize(this.getWidth(), this.getHeight());
		m.repaint();

}

So hier die Klasse Main, die den JFRAME bereitstellt in dem das JPanel liegt.

Java:
public class Main extends JFrame implements ActionListener, Serializable{
	
	private  JMenuBar menuBar = new JMenuBar();
	private  JMenu game = new JMenu("Spiel");
	private  JMenuItem newGame = new JMenuItem("Neues Spiel");
	private  JMenuItem exitGame = new JMenuItem("Programm beenden");
	private  JMenuItem saveGame = new JMenuItem ("Spiel speichern");
	private  JMenuItem loadGame = new JMenuItem("Spiel laden");
	private  JMenuItem endGame = new JMenuItem("Spiel beenden");
	private  Cascade cascade = new Cascade(false,this);
	
	private ConfigDialog cfgDialog = null; //Für persistenzzwecke

		
	public Main (){}
	public Main(int i){
		this.setTitle("Cascade Marco Herbert 6931863");
		
	/*	Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (d.width - getSize().width ) / 2;
		int y = (d.height -getSize().height ) / 2;
		*/

		game.add(newGame);
		game.add(endGame);
		game.addSeparator();
		game.add(loadGame);
		game.add(saveGame);
		game.addSeparator();
		game.add(exitGame);
		menuBar.add(game);
		this.setJMenuBar(menuBar);
		this.setSizeOfFrame();
	//	this.setLocation(x, y);
		this.setVisible(true);
		
		newGame.addActionListener(this);
		saveGame.addActionListener(this);
		exitGame.addActionListener(this);
		loadGame.addActionListener(this);
		endGame.addActionListener(this);
		
	}
	
			
	
	public void writeConfigToMain(ConfigDialog d){
		cfgDialog=d;
	} 
		
	public ConfigDialog readConfigDialogFromMain(){
		return cfgDialog;
	}
	
		
	public void endGame(){
		this.remove(cascade);
		this.repaint();
		}
	public void exitGame(){
		System.exit(1);
	}
	
	private void loadGame(){
		
	}
	
	private void saveGame(){
		
	}
	
	private void setSizeOfFrame(){
		this.setSize(new Dimension(800,600));
		
	}
So hier wird dann ein neues Spiel gestartet indem eine neue Instanz von Cascade erzeugt wird. Es wird unter anderem die Referenz auf das JFRAME (this) mitgegeben um dann in der Cascade-Klasse (siehe oben) die Größe des JFrames anzupassen.

Java:
	public void newGame(){
		endGame();
		this.repaint();
		cascade = new Cascade(true, this);
		this.getContentPane().add(cascade);
		this.pack();
		getContentPane().repaint();
		this.setSizeOfFrame();
		
		
		
	}
	
	
	public void actionPerformed(ActionEvent e){
		if (e.getSource().equals(exitGame)) exitGame();
		if (e.getSource().equals(loadGame))loadGame();
		if (e.getSource().equals(saveGame))saveGame();
		if (e.getSource().equals(newGame))newGame();
		if (e.getSource().equals(endGame)) endGame();
	}
	
	
	
		
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		new Main(1);
				
	}

Ich hoffe man kann was erkennen!?

Und wenn wir schon dabei sind :) Wie kann ich das JFrame dann am Bildschirm zentrieren. Also nicht so wie ich, dass ich die Linke oberere Ecke ins Zentrum setze, sondern aus der Größe des aktuellen JFrames den Mittelpunkt berechne und diesen dann Mittelpunkt dann am Bildschirm zentriert darstelle.

Gruß Screaper
 
Hallo,

ich sehe leider nicht, wo du Cascade eine Größe setzt. So wie es aussieht ist gar keine gesetzt.
Dass sich die Größe des Frames nicht ändert liegt halt am pack(). Wenn du deinem Panel eine Größe mit setPreferredSize() setzt, muss du dem JFrame keine Größe setzen. Dann reicht es, wenn du jedes mal nachdem du das Panel hinzugefügt hast, die Methode pack() ausführst.

Mit
Code:
frame.setLocationRelativeTo(null);

erreichst du, dass das Fenster mittig angezeigt wird.

Gruß

Sascha
 

Neue Beiträge

Zurück