GUI erstellen mit GridBagLayout

Hallo,

ich habe schon oft GUI’s mit LayoutManagern, auch mit dem GridBagLayout programmiert. Diesmal allerdings klappt das nicht so wirklich wie ich will und ich brauche etwas Hilfe, um die GUI auf meine Wünsche anzupassen.

Wenn ich das Programm starte sieht meine GUI so aus:

Wenn ich dann das Fenster “resize” sieht die GUI so aus:

Ich schätze diese Änderung kommt durch weighty und weightx Angaben zustande, obwohl ich es auch nicht komplett nachvollziehen kann.

Aussehen soll es wie in Bild 2, nur das Zusammenfassung und Schauspieler beides TextAreas sind und daher auch größer sein sollen als die Textfelder oben drüber. Diese sollen eigentlich etwas kleiner werden. Mein Code für das Erstellen des JDialogs ist dieser hier;
(PlaceholderText(field)(area) ist eine eigene Klasse, die dazu benutzt wird, um den Textfelder und TextAreas placeholder mitzugeben, coverPanel ist ein JPanel der das entsprechende Image zeichnet)


private void createMovieDialog() {
		dialog = new JDialog(this);
		dialog.setTitle("Film eintragen...");
		dialog.setSize(500, 280);
		dialog.setModal(true);

		dialog.setLayout(new GridBagLayout());

		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.BOTH;
		c.gridx = 0;
		c.gridy = 0;
		c.weightx = 1.0;
		c.weighty = 1.0;
		c.gridwidth = 2;
		c.gridheight = 1;

		nameField = new PlaceholderTextField("");
		nameField.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {
				changed();
			}

			public void removeUpdate(DocumentEvent e) {
				changed();
			}

			public void insertUpdate(DocumentEvent e) {
				changed();
			}

			public void changed() {
				if (nameField.getText().equals("")) {
					addButton.setEnabled(false);
				} else {
					addButton.setEnabled(true);
				}

			}
		});
		nameField.setPlaceholder("Filmname");
		
		dialog.add(nameField, c);

		isbnField = new PlaceholderTextField("");
		isbnField.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {
				changed();
			}

			public void removeUpdate(DocumentEvent e) {
				changed();
			}

			public void insertUpdate(DocumentEvent e) {
				changed();
			}

			public void changed() {
				if (isbnField.getText().equals("")) {
					addButton.setEnabled(false);
				} else {
					addButton.setEnabled(true);
				}

			}
		});
		
		c.gridy = 1;
		isbnField.setPlaceholder("ISBN");
		dialog.add(isbnField, c);
		
		
		yearField = new PlaceholderTextField();
		yearField.setPlaceholder("Jahr...");
		c.gridy = 2;
		dialog.add(yearField,c);
		
		producerField = new PlaceholderTextField();
		producerField.setPlaceholder("Produzent...");
		c.gridy = 3;
		dialog.add(producerField,c);

		actorsArea = new PlaceholderTextArea();
		actorsArea.setPlaceholder("Schauspieler");
		actorsArea.setLineWrap(true);
		actorsArea.setWrapStyleWord(true);
		actorsArea.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_TAB) {
					e.consume();
					KeyboardFocusManager.getCurrentKeyboardFocusManager()
							.focusNextComponent();
				}

				if (e.getKeyCode() == KeyEvent.VK_TAB && e.isShiftDown()) {
					e.consume();
					KeyboardFocusManager.getCurrentKeyboardFocusManager()
							.focusPreviousComponent();
				}
			}
		});
		

		JScrollPane actorScrollPane = new JScrollPane(actorsArea);
		c.weighty = 1.0;
		c.gridy = 4;
		c.gridheight = 2;
		dialog.add(actorScrollPane, c);

		summaryArea = new PlaceholderTextArea();
		summaryArea.setPlaceholder("Zusammenfassung");
		summaryArea.setLineWrap(true);
		summaryArea.setWrapStyleWord(true);
		summaryArea.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_TAB) {
					e.consume();
					KeyboardFocusManager.getCurrentKeyboardFocusManager()
							.focusNextComponent();
				}

				if (e.getKeyCode() == KeyEvent.VK_TAB && e.isShiftDown()) {
					e.consume();
					KeyboardFocusManager.getCurrentKeyboardFocusManager()
							.focusPreviousComponent();
				}
			}
		});

		JScrollPane summaryScrollPane = new JScrollPane(summaryArea);
		c.gridy = 6;
		dialog.add(summaryScrollPane, c);

		addButton = new JButton("Hinzufügen...");
		addButton.setEnabled(false);
		addButton.addActionListener(this);
		addButton.setActionCommand("addButton");

		c.gridy = 8;
		c.gridheight = 1;
		c.weighty = 0.0;
		dialog.add(addButton, c);

		scanButton = new JButton("Suchen...");
		scanButton.addActionListener(this);
		scanButton.setActionCommand("scanButton");

		c.gridx = 2;
		dialog.add(scanButton, c);
		
		coverPanel = new CoverPanel(null);
		coverPanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED,
				Color.black, Color.black));
		coverPanel.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				imgChooser = new JFileChooser();
				String[] suffices = ImageIO.getReaderFileSuffixes();

				for (int i = 0; i < suffices.length; i++) {
					FileFilter filter = new FileNameExtensionFilter(suffices**
							+ " files", suffices**);
					imgChooser.addChoosableFileFilter((FileFilter) filter);
				}
				imgChooser.setFileFilter(imgChooser.getChoosableFileFilters()[0]);
				imgChooser.showOpenDialog(tablePanel);
				File file = imgChooser.getSelectedFile();
				if(file != null) {
				String extension = "";

				int i = file.getPath().lastIndexOf('.');
				if (i > 0) {
					extension = file.getPath().substring(i + 1);
				}
				try {
					image = ImageIO.read(file);
					coverPanel.setImage(image);
					coverPanel.setExtensionForImage(extension);
				} catch (IOException ex) {
					ex.printStackTrace();
				}
				}

			}
		});
		
		c.gridy = 0;
		c.weighty = 1;
		c.weightx = 0;
		c.gridheight = 3;
		c.gridwidth = 1;
		dialog.add(coverPanel, c);
		
		
		
		seenBox = new JCheckBox("Gesehen");
		c.weighty = 0;
		c.weightx = 1;
		c.gridy = 3;		
		c.gridheight = 1;
		c.gridwidth = 1;
		dialog.add(seenBox, c);
		
		boughtBox = new JCheckBox("Gekauft");
		c.gridy = 4;
		dialog.add(boughtBox, c);



		starRater = new StarRater(5, 1, 1);
		rating = 1;
		starRater.addStarListener(new StarRater.StarListener() {
			public void handleSelection(int selection) {
				rating = selection;
			}
		});

		
		c.gridy = 5;
		dialog.add(starRater, c);

		
		
		dialog.setLocationRelativeTo(this);
		dialog.setVisible(true);
	}


Bissl was zum Lesen: http://wiki.byte-welt.net/wiki/GridBagLayout

In deinem Fall solltest du zusätzlich zu setPreferredSize() mit setMinimumSize() und setMaximumSize() arbeiten.

Also habe durch die genannten Methode schonmal meine Textfelder und Textareas so erstellen können wie ich das gerne möchte (siehe Bild):

Wie ich es jedoch hinbekommen, dass der Panel am oberen linken Rand höher ist als er breit ist, ist mir noch nicht ganz aufgegangen. Habe mit den Methoden etwas rumexperimentiert, aber komme nicht wirklich auf das gewünscht Ergebnis. Im Prinzip will ich diese rechte Spalte also gridx = 2 einfach nur in der Breite verkleinern.

Wie isses, wenn du für die rechte Spalte (c.gridx = 2) das weightx der seenBox auf 0 setzt, wie verhält sich dann deine GUI?

Danke so hauts nun hin. Kaum hatte ich das geändert war mir auch gleich warum die GUI so aussah wie sie aussah. Habe das rausgenommen und coverPanel mit setPreferredSize, setMax/MinSize dann angepasst. Nun klappt alles wie ich es haben möchte + es verhält sich auf beim resize richtig,