setResizable(false) ändert Größe des Contentpane

jemandzehage

Aktives Mitglied
Hallo,

ich habe folgendes Problem. Ich habe ein JFrame, in das einige Panels etc. hinein kommen sollen und das Fenster soll eine feste größe haben. Das geht ja einfach mit setResizable(false). Wenn ich diesen befehl aufrufe, wird das Fenster um 10 Pixel vergrößert. Interessanterweise verändert sich nicht die Größte des JFrames, sondern die größe des Contentpanes. Woran liegt das?? und wie kann ich das verhindern??

Hier mal der Code:
Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class ResizableTest implements MouseListener{
	private JFrame frame;
	
	public ResizableTest() {
		frame = new JFrame("Resize Test");
		frame.setVisible(true);
		
		Container c = frame.getContentPane();
		c.setLayout(new BorderLayout());
		
		JPanel panel1 = new JPanel();
		panel1.setPreferredSize(new Dimension(300, 300));
		
		c.add(panel1, BorderLayout.CENTER);
		
		frame.addMouseListener(this);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.pack();
		frame.requestFocus();
	}

	@Override
	public void mouseClicked(MouseEvent e) {}

	@Override
	public void mouseEntered(MouseEvent e) {}

	@Override
	public void mouseExited(MouseEvent e) {}

	@Override
	public void mousePressed(MouseEvent e) {
		System.out.println("start mousePressed");
		System.out.println("Frame size: " + frame.getWidth() + "|" + frame.getHeight());	
		System.out.println("Contentpane size: " + frame.getContentPane().getWidth() + "|" + frame.getContentPane().getHeight());
		
		System.out.println("frame.setResizable(" + !frame.isResizable() + ");");
		frame.setResizable(!frame.isResizable());
		
		System.out.println("Frame size: " + frame.getWidth() + "|" + frame.getHeight());
		System.out.println("Contentpane size: " + frame.getContentPane().getWidth() + "|" + frame.getContentPane().getHeight());
		System.out.println("end mousePressed");
	}

	@Override
	public void mouseReleased(MouseEvent e) {}
	
	public static void main(String[] args) {
		new ResizableTest();
	}
}

Ich danke für Hilfe!!
 
Das hängt vom verwendeten System ab. Offensichtlich werden auf Deinem System Fenster mit unveränderlicher Größe mit einem anderen Rahmen ausgestattet. Da die Hohheit über diese Entscheidung im System hängt, kannst Du das eigentlich nicht verhindern. Du kannst das LookAndFeel das Fenster dekorieren lassen; sofern das jeweilige LAF diese Funktion unterstützt: [c]JFrane.setDefaultLookAndFeelDecorated(true)[/c]. Oder Du rufst [c]pack()[/c] neu auf; dann wird die Fenstergröße geändert anstatt die Größe des ContentPane.

Zu Deinem Beispiel: [c]setVisible(true)[/c] sollte man grundsätzlich nach dem Initialisieren des Frames machen. Das ergibt sich allerdings automatisch, da man das ohnehin niemals im Konstruktor macht. Das Anzeigen (sichtbar setzen) sollte man einfach immer dem Aufrufenden überlassen. Außerdem sollte eine GUI immer auf dem EDT erzeugt werden, sonst wird's öfter mal unerklärliche Probleme geben (besonders wenn man mal eine nicht-Sun-Maschine verwendet):
Java:
/** Creates the GUI. Call on EDT, only! */
static void createAndShowGui() {
  new ResizableTest().setVisible(true);
}

/** @param args ignored */
public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {

    public void run() {
      createAndShowGui();
    }
  });
}

Ebenius
 
Ich danke für die Antwort und auch für die weiteren Tipps. Ich hab das nur schnell zusammengebastelt um mein Problem darzustellen. Aber das mit dem EDT war mir nicht bekannt, dass man das so macht, also nochmals danke.

Ich hätte da noch eine Lösungsidee, aber ich weiß nicht ob das Sinnvoll ist. Was ist, wenn man int das Contentpane einen ComponentListener hängt, der überwacht wenn sich die Größe ändert und sobald die größe geändert wird, dann setzt er sie wieder zurück zu seinen vorherigen größe. (abgesehen vom ersten mal, wenn die größe quasi initialisiert wird) . Ist soetwas sinnvoll??
 
Die Hohheit über die Größe einer Komponente hat eigentlich die Elternkomponente. Insofern würde ich diesen Ansatz eher nicht verfolgen.

Ebenius
 
Ich habs trotzdem weiter verfolgt, aber nur mit mäßigem Erfolg. Weil wenn ich im ComponentListener bei resize() die Größe ändere folgt darauf ein Rekursions-Vorgang, da duch die größenänderung wieder resize() aufgerufen wird. Am einfachsten ist es damit:

Java:
JFrame.setDefaultLookAndFeelDecorated(true)

Sieht natürlich im Betriebssystem nicht ganz so schick aus. Trotzdem danke!
 

Neue Themen


Zurück
Oben