Größe eines Labels bei GridBagLayout festlegen

Rufus.Mueller

Bekanntes Mitglied
Ich habe JPanel mit BorderLayout. Nach SOUTH kommt ein anderes Label mit einem Button. Nach CENTER kommt ein Label mit einem Text. Um dieses Label etwa in der Mitte des Bildschirms stehen zu haben, habe ich es noch mal in ein GridBagLayout gepackt. Jetzt steht es auch in der Mitte, wie ich es mir gewünscht habe. Nur die Größe stimmt leider überhaupt nicht. setPreferredSize hat nicht die geringste Wirkung.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

//**Card4 Anwesiung nach Übung***

public class Card4 extends JPanel {
	
	//Deklarationsteil
	JPanel zentralPanel;
	JPanel suedPanel;
	JLabel anweisung;
	Window window;
	JButton weiterButton;
	
	//Konstruktor
	public Card4(Window window){
		

		
		
		this.window = window;
		this.setLayout(new BorderLayout());
		zentralPanel = new JPanel();
		zentralPanel.setLayout(new BorderLayout());
		anweisung = new JLabel("<html>  <p align='justify'>" + "Fühlen Sie sich mit der " +
				"Bedienung des Programms vertraut? Wenn Ihnen noch etwas unklar zur " +
				"Bedienung oder zur Aufgabe ist,heben Sie jetzt bitte den Arm um den Versuchs-" +
				"leiter auf Sie <aufmerksam zu machen. Ansonsten können Sie jetz loslegen. " +
				"Bitte wählen Sie in dem Fall „Experiment beginnen“!" + "</p>  </html>");
		anweisung.setOpaque(true);
		zentralPanel.add(anweisung, BorderLayout.CENTER);
		this.add(zentralPanel, BorderLayout.CENTER);	
		zentralPanel.setOpaque(true);
		anweisung.setBackground(Color.GREEN);
		
		//GridBagLayout für den zentralPanel festlegen
		GridBagConstraints zentralPanelConstraints = new GridBagConstraints();
		zentralPanelConstraints.gridx = 0;
		zentralPanelConstraints.gridy = 0;
		zentralPanelConstraints.gridwidth = 2;
		zentralPanelConstraints.gridheight = 1; 
		

		zentralPanel.add(anweisung);
		zentralPanel.setLayout(new GridBagLayout());
		//zentralPanel.setPreferredSize(new Dimension (500,500));
		
		
		
		
		
		
		weiterButton = new JButton("Experiment starten");
		suedPanel = new JPanel();
		suedPanel.add(weiterButton);
		this.add(suedPanel, BorderLayout.SOUTH);
		
		
		
		
		
		}
	}
 
Du hast da noch ein kleines Durcheinander in deinem Code:
[JAVA=31]zentralPanel.setLayout(new BorderLayout());[/code]
Erst setzt du das BorderLayout, und kurz später:
[JAVA=52]zentralPanel.setLayout(new GridBagLayout());[/code]
nochmal ein GridBagLayout auf das selbe Panel.
 
Für card4 habe ich es jetzt hinbekommen. Ich habe auch mal versucht die Klasse übersichtlicher zu strukturieren. Dabei habe ich bemerkt, dass ich bereits ohne die Setzung von Constraints zum gesetzten Ziel komme. Probleme macht aber noch card2. Hier bekomme ich eine IllegalArgumentException für Zeile 71.



Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

//**Card4 Anweisung nach Übung***

public class Card4 extends JPanel {
	
	//Deklarationsteil
	JPanel aeusseresZentralPanel;
	JPanel inneresZentralPanel;

	JPanel suedPanel;
	JLabel anweisung;
	Window window;
	JButton weiterButton;
	
	//Konstruktor
	public Card4(Window window){
		
		
		
		//Window
		this.window = window;
		
		
		//Komponenten erzeugen
		aeusseresZentralPanel = new JPanel();
		inneresZentralPanel = new JPanel();
		anweisung = new JLabel("<html>  <p align='justify'>" + "Fühlen Sie sich mit der " +
				"Bedienung des Programms vertraut? Wenn Ihnen noch etwas unklar zur " +
				"Bedienung oder zur Aufgabe ist, heben Sie jetzt bitte den Arm um den Versuchs" +
				"leiter auf sich aufmerksam zu machen.<p><p>Ansonsten können Sie jetzt loslegen. " +
				" Bitte wählen Sie in dem Fall „Experiment beginnen“! " + "</p>  </html>");
		weiterButton = new JButton("Experiment beginnen");
		suedPanel = new JPanel();
		
		//den Komponenten Layouts geben
		this.setLayout(new BorderLayout());
		aeusseresZentralPanel.setLayout(new BorderLayout());
		inneresZentralPanel.setLayout(new GridBagLayout());

		
		
		//GridBagLayout für inneresZentralPanel festlegen
		GridBagConstraints inneresZentralPanelConstraints = new GridBagConstraints();
	
		//Eigenschaften der Komponenten festlegen
		aeusseresZentralPanel.setOpaque(true);
		anweisung.setPreferredSize(new Dimension (410,410));
		anweisung.setFont(new Font("Dialog", 0, 20));
		inneresZentralPanel.setBackground(Color.WHITE);
		suedPanel.setBackground(Color.WHITE);
		suedPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 50, 0));

		
		
		//add-en
		inneresZentralPanel.add(anweisung,inneresZentralPanelConstraints);
		this.add(aeusseresZentralPanel, BorderLayout.CENTER);	
		aeusseresZentralPanel.add(inneresZentralPanel, BorderLayout.CENTER);
		suedPanel.add(weiterButton);
		this.add(suedPanel, BorderLayout.SOUTH);
		
		}
	}



Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Card2 extends JPanel{
	
	//Deklarationsteil
	JButton uebStarten;
	Window window;
	JPanel suedpanel;
	
	JLabel anweisung;
	JLabel abbildung;
	JPanel inneresZentralpanel;
	JPanel aeusseresZentralpanel;
	JPanel abbildungsPanel;
	
	
	//Konstruktor
	public Card2(Window window) {
		
		//Window
		this.window = window;
		
		//Komponenten erzeugen
		suedpanel= new JPanel();
		inneresZentralpanel = new JPanel();
		aeusseresZentralpanel= new JPanel();
		abbildung = new JLabel(new ImageIcon("C:/Dokumente und Einstellungen/Ralf/Desktop/wordcorsi.jpg"));
		uebStarten = new JButton("Übung starten");
		anweisung = new JLabel("<html>  <p align='justify'>" + "Sobald  Sie auf „Start“ drücken, werden nacheinander " +
				"einige der blauen   Quadrate gelb aufleuchten (Sequenz). Ihre Aufgabe ist es, anschließend die Quadrate" +
				" in genau derselben Reihenfolge anzuklicken wie sie vorher aufgeleuchtet haben.  Wenn Sie die Quadrate " +
				"angeklickt haben, drücken Sie bitte auf „Eingabe beenden“. Sie erhalten dann eine Rückmeldung, ob Sie " +
				"die Quadrate korrekt eingegeben haben oder  nicht.Mit „Start“ können Sie die nächste Sequenz starten. " +
				"Im Folgenden werden Sie zunächst eine Übung durchlaufen,  um sich mit der Aufgabenstellung vertraut " +
				"zu machen. Bitte wählen Sie „Übung starten“, um mit der Übung zu beginnen. " + "</p>  </html>");
		
		
		
		//***Layouts setzen
		this.setLayout(new BorderLayout());	
		aeusseresZentralpanel.setLayout(new GridBagLayout());
		inneresZentralpanel.setLayout(new BoxLayout(inneresZentralpanel, BoxLayout.Y_AXIS));
		

		
		//GridBagLayout für das äußereZentralpanel festlegen
		GridBagConstraints auesseresZentralPanelConstraints = new GridBagConstraints();


		//*** add-en 
		this.add(suedpanel, BorderLayout.SOUTH);
		suedpanel.add(uebStarten);
		inneresZentralpanel.add(anweisung);
		inneresZentralpanel.add(Box.createRigidArea(new Dimension(0, 50)));
		aeusseresZentralpanel.add(inneresZentralpanel);
		this.add(aeusseresZentralpanel, auesseresZentralPanelConstraints);
	
		
		//*** Eigenschaften der Komponenten festlegen
		uebStarten.setPreferredSize(new Dimension(160, 40));
		this.setBackground(Color.WHITE);
		anweisung.setOpaque(true);
		abbildung.setOpaque(true);
		anweisung.setBackground(Color.CYAN);
		abbildung.setBackground(Color.ORANGE);
		anweisung.setFont(new Font("Dialog", 0, 15));
		anweisung.setPreferredSize(new Dimension(500, 100));
		abbildungsPanel.setPreferredSize(new Dimension(206, 344));
		abbildung.setPreferredSize(new Dimension(206, 344));

		
		

		uebStarten .addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent arg) {
			Card2.this.window.card3Anzeigen();
		};
	});	
	}
}
 
[JAVA=71] this.add(aeusseresZentralpanel, auesseresZentralPanelConstraints);[/code]

Code:
this
ist hier dein JPanel card4, dem du in Zeile 48

[java=48]this.setLayout(new BorderLayout());[/code]

ein BorderLayout setzt...nun willst du dieses Panel beim adden ein GridbagConstraints mitgeben...erwartet wird aber eine BorderLayout-Area (South, West, Center etc)
 
Ich würde das nicht so umständlich mit inneresZentralPanel und aeusseresZentralPanel machen. Das ist zu verschachtelt und verkompliziert es nur unnötig.
 
Wie wäre es denn einfacher? Ich hab eine Grafik und einen Text (beide in Labels gepackt). Die sollen horizontal in der Mitte stehen. Schön wärs, wenn man das Textlabel größer und breiter als das Grafiklabel machen könnte. Auf dem Bereich SOUTH des Frames soll noch ein Button stehen. Text- und Bildlabel sollen über-, evtl. auch untereinander stehen.

Zuerst hatte ich dem Frame ein BorderLayout verpasst und dann dem CENTER ein BoxLayout. Dann war das aber alles nicht so richtig mittig, darum wollte ich die beiden LAbels bevor ich Sie auf CENTER stelle noch mal in ein GridBagLayout einwickeln.
 
Ich hab mal deine Klasse Card4 ein bisschen umgeändert und übersichtlicher geschrieben. Vielleicht kannst du ja was damit anfangen und es dann erweitern, so wie du es brauchst.

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Card4
extends JPanel {

    private Window window;
    
    //Konstruktor
    public Card4(Window window){

        //Window
        this.window = window;
        
        // Layout setzen
        this.setLayout(new BorderLayout());
        
        JLabel anweisung = new JLabel("<html>  <p align='justify'>" + "Fühlen Sie sich mit der " +
                "Bedienung des Programms vertraut? Wenn Ihnen noch etwas unklar zur " +
                "Bedienung oder zur Aufgabe ist, heben Sie jetzt bitte den Arm um den Versuchs" +
                "leiter auf sich aufmerksam zu machen.<p><p>Ansonsten können Sie jetzt loslegen. " +
                " Bitte wählen Sie in dem Fall „Experiment beginnen“! " + "</p>  </html>");
        
        anweisung.setBackground(Color.RED);
        anweisung.setOpaque(true);
        anweisung.setFont(new Font("Dialog", 0, 12));
        anweisung.setPreferredSize(new Dimension(200, 200));
        
        JButton weiterButton = new JButton("Experiment beginnen");
        
        JPanel inneresPanel = new JPanel();
        inneresPanel.setBackground(Color.YELLOW);
        inneresPanel.setLayout(new GridBagLayout());
        
        GridBagConstraints c = new GridBagConstraints();
        
        c.gridx = 0;
        c.gridy = 0;

        inneresPanel.add(anweisung, c);
        
        c.gridx = 0;
        c.gridy = 1;
        
        inneresPanel.add(weiterButton, c);

        this.add(inneresPanel, BorderLayout.CENTER);
        
    }

}

Ich hab das JPanel und das JLabel mal gelb und rot eingefärbt, damit man deren Grössen besser sehen kann. Das gelbe JPanel dehnt sich komplett aus, weil es im CENTER-Bereich von Card4 liegt. Das rote JLabel liegt jetzt zentriert im JPanel und darunter der Button.
 
Sieht ähnlich aus wie das was ich zum Schluss hatte, ist aber im Vergleich wirklich unglaublich übersichtlich! Hab's übernommen. Ein Gimmick ist, dass ich nun die Höhenposition des Buttons über die Labelgröße verstellen kann!
 
Mit dieser Vorlage lässt sich schon einiges anstellen. Ich erstelle jetzt alle Karten damit. Manche Feinheit gelingt noch nicht. In unten stehender Klasse versuche ich den Button noch etwas weiter nach unten zu verschieben. Habe es versucht indem ich inneresPanel in der Höhe verändert habe und indem ich versucht habe eine RigidArea vor den Button zu setzen. Beides erfolglos.

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class Card5 extends JPanel {
 
     Window window;
    
    //Konstruktor
    public Card5(Window window){
 
        //Window
        this.window = window;
        
        // Layout setzen
        this.setLayout(new BorderLayout());
        
        JLabel anweisung = new JLabel("<html> <p align='justify'>" + "Im Folgenden " +
        		"bekommen Sie eine Ansicht wie die rechts stehende. Sobald  Sie auf " +
        		"„Start“ drücken, werden nacheinander einige der blauen   Quadrate " +
        		"gelb aufleuchten (Sequenz). Danach werden eine Reihe von Wörtern " +
        		"eingeblendet. Ihre Aufgabe ist es, anschließend die Quadrate in " +
        		"genau derselben Reihenfolge anzuklicken wie sie vorher aufgeleuchtet" +
        		" haben und danach die Wörter in ein eingeblendetes Textfeld einzugeben. " +
        		"Bitte drücken Sie auf „Return“ nachdem Sie ein Wort eingegeben haben. " +
        		"Wenn Sie alle Quadrate und Worte eingegeben haben, drücken Sie bitte " +
        		"auf „Eingabe beenden“. Sie erhalten dann eine Rückmeldung, ob Ihre Eingaben " +
        		"richtig sind oder nicht. Mit „Start“ können Sie die nächste Sequenz starten. " +
        		"Im Folgenden werden Sie zunächst eine Übung durchlaufen bei der die Daten " +
        		"noch nicht aufgezeichnet werden. In der Übung können Sie sich mit der " +
        		"Aufgabenstellung und der Bedienung vertraut machen. Bitte wählen Sie" +
        		"jetzt „Übung starten“, um mit der Übung zu beginnen."+  " </html>" );
        
    
        anweisung.setOpaque(true);
        anweisung.setFont(new Font("Dialog", 0, 20));
        anweisung.setPreferredSize(new Dimension(100, 100));
        
        JButton weiterButton = new JButton("Übung starten");
       
       
        JPanel inneresPanel = new JPanel();
        inneresPanel.setPreferredSize(new Dimension (1000,700));
		JLabel abbildung1 = new JLabel(new ImageIcon("C:/Dokumente und Einstellungen/Ralf/Desktop/wordcorsi.jpg"));
		JLabel abbildung2 = new JLabel(new ImageIcon("C:/Dokumente und Einstellungen/Ralf/Desktop/wordcorsi.jpg"));

		
		
		
		JPanel boxPanel2= new JPanel();
		boxPanel2.setLayout(new BoxLayout(boxPanel2, BoxLayout.Y_AXIS));	
		boxPanel2.add(abbildung1);
		boxPanel2.add(Box.createRigidArea(new Dimension(0, 30)));
		boxPanel2.add(abbildung2);
		boxPanel2.setPreferredSize(new Dimension (300,200));
		
		JPanel boxPanel= new JPanel();
		boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.X_AXIS));
		boxPanel.add(anweisung);
		boxPanel.add(Box.createRigidArea(new Dimension(30, 0)));
		boxPanel.add(boxPanel2);
		boxPanel.add(Box.createRigidArea(new Dimension(40, 0)));
		boxPanel.setPreferredSize(new Dimension (900,500));

        
		inneresPanel.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
        
        	c.gridx = 0;
        	c.gridy = 0;
 
        inneresPanel.add(boxPanel, c);
        
        	c.gridx = 0;
        	c.gridy = 1;
        
       
        inneresPanel.add(weiterButton, c);
 
        this.add(inneresPanel, BorderLayout.CENTER);
        
        weiterButton.addActionListener(new ActionListener() {

    		@Override
    		public void actionPerformed(ActionEvent arg) {
    			Card5.this.window.card3Anzeigen();
    		};
    	});
        
    }
 
}
 
Hmm, ich weiss ja nicht, warum du da jetzt noch ein JPanel mit einem BoxLayout einfügst, anstatt alle Komponenten dort in das JPanel mit dem GridBagLayout. Ich hatte dir mit meinem Code doch gezeigt, wie du weitere Komponenten zum GidBagLayout hinzufügen kannst, ohne weitere Verschachtelungen mit JPanels. Wenn du mehr Abstand zwischen den Komponenten haben willst, kannst du auch mit insets arbeiten. Nachzulesen alles hier: How to Use GridBagLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
 

Zurück
Oben