# Einfache Frage zu GridBagLayout



## ernst (9. Mrz 2009)

Hallo allerseits,
1)
Beim Recherchieren im Internet und mit Hilfe eines kleinen Demoprogramms ist mir klar geworden, was im GridBagLayout bedeutet:
gridx 
gridy 
gridwidth 
gridheight 

Unklar ist mir noch, was bedeutet:
weightx 
weighty 
Ich habe zwar diese Werte in meinem Programm unten verstellt, doch das hat keine optische Auswirkungen gehabt.

2)
Desgleichen ergibt
addiereKopmonente(myPanel,  gbl, myb4, 0, 2, 3, 1, 1, 1);
und 
addiereKopmonente(myPanel,  gbl, myb4, 0, 2, 9, 5, 1, 1);
auch das gleiche optische Ergebnis. Warum?
Ich verstehe nicht, was GridBagLayout macht?


3)
In meinem Demoprogramm (3 Spalten x 5 Zeilen) wird auf dem Bildschirm folgendes Fenster ausgegeben:


```
+----------------------+---+
|                      | 2 |
|          1           |---|
|                      | 3 |
|----------------------+---+
|          4               |
|----------------------+---+
|          5           |   |
|----------------------+ 7 |
|          6           |   |
+----------------------+---+
```

Leider wird der Button mit der Beschriftung 4 riesengroß 
dargestellt (obwohl alle Buttons eigentlich fast die gleiche Beschriftung haben) und die anderen Buttons recht klein, wobei diese rechts noch Platz haben, während der Button 4 über die ganze Tabellenbreite geht.
Warum ist das so?
Wer bestimmt die Größe der einzelnen Buttons?

4)
Mein späteres Ziel ist eigentlich folgendes:
Oben am Fenster ein Schieberegler, daneben ein oder 2 Buttons.
Darunter gleich anschließend eine Zeichnung (dort bewegt sich ein Auto, wobei ich mit dem Schieberegeler die Geschwindigkeit des Autos regeln kann).
Also, zwei kleine Elemente (Schieberegeler und Button) und ein großes (Zeichnung).
Wie kann ich innerhalb eines GridBagLayout die Größen festlegen?

---------------------------------------------------
[HIGHLIGHT="Java"]package gridbaglayout2;
import java.awt.*;

import javax.swing.*;

public class MainGridBagLayout2 {
	public static void main(String[] args) {
		MyFenster myf = new MyFenster();
		myf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyFenster extends JFrame{
	private Container mycont;
	private JButton myb1, myb2, myb3, myb4, myb5, myb6, myb7;
	private JPanel myPanel;
	private GridBagLayout gbl;

	public MyFenster(){
		mycont = getContentPane();
		myPanel=new JPanel();
		myb1=new JButton("B1");
		myb2=new JButton("B2");
		myb3=new JButton("B3");
		myb4=new JButton("B4");
		myb5=new JButton("B5");
		myb6=new JButton("B6");
		myb7=new JButton("B7");
		gbl = new GridBagLayout();

        addiereKopmonente(myPanel,  gbl, myb1, 0, 0, 2, 2, 1, 1);
        addiereKopmonente(myPanel,  gbl, myb2, 2, 0, 1, 1, 1, 1);
        addiereKopmonente(myPanel,  gbl, myb3, 2, 1, 1, 1, 1, 1);
        addiereKopmonente(myPanel,  gbl, myb4, 0, 2, 3, 1, 1, 1);
        addiereKopmonente(myPanel,  gbl, myb5, 0, 3, 2, 1, 1, 1);
        addiereKopmonente(myPanel,  gbl, myb6, 0, 4, 2, 1, 1, 1);
        addiereKopmonente(myPanel,  gbl, myb7, 2, 3, 1, 2, 1, 1);

        myPanel.setLayout(gbl);
		mycont.add(myPanel);

		setTitle("Meine Zeichnung");
		setLocation(30,60);
		setSize(600,400);
		setVisible(true);
	}

    public void addiereKopmonente(Container cont, GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.NONE;
        gbc.anchor = GridBagConstraints.PAGE_START;

        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        gbl.setConstraints(c, gbc);
        cont.add(c);
    }

}[/HIGHLIGHT]
---------------------------------------------------



mfg
Ernst


----------



## L-ectron-X (10. Mrz 2009)

Hier erst mal der berichtigte Code:

[HIGHLIGHT="Java"]package gridbaglayout2;

import java.awt.*;
import javax.swing.*;

public class MainGridBagLayout2 {
    public static void main(String[] args) {
        MyFenster myf = new MyFenster();
    }
}

class MyFenster extends JFrame{
    private JButton myb1, myb2, myb3, myb4, myb5, myb6, myb7;

    public MyFenster(){
        super("Meine Zeichnung");
        setSize(400, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel myPanel = new JPanel(new GridBagLayout());

        myb1=new JButton("B1");
        myb2=new JButton("B2");
        myb3=new JButton("B3");
        myb4=new JButton("B4");
        myb5=new JButton("B5");
        myb6=new JButton("B6");
        myb7=new JButton("B7");

        addiereKomponente(myPanel, myb1, 0, 0, 1, 2, 1, 1, GridBagConstraints.BOTH);
        addiereKomponente(myPanel, myb2, 1, 0, 1, 1, 0, 1, GridBagConstraints.BOTH);
        addiereKomponente(myPanel, myb3, 1, 1, 1, 1, 0, 1, GridBagConstraints.BOTH);
        addiereKomponente(myPanel, myb4, 0, 2, 2, 1, 1, 1, GridBagConstraints.BOTH);
        addiereKomponente(myPanel, myb5, 0, 3, 1, 1, 1, 1, GridBagConstraints.BOTH);
        addiereKomponente(myPanel, myb6, 0, 4, 1, 1, 1, 1, GridBagConstraints.BOTH);
        addiereKomponente(myPanel, myb7, 1, 3, 1, 2, 0, 1, GridBagConstraints.BOTH);

        add(myPanel, BorderLayout.CENTER);

        setVisible(true);
    }

    public void addiereKomponente(Container cont, Component c, int x, int y, int width, int height, double weightx, double weighty, int fill){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = fill;
        //gbc.anchor = GridBagConstraints.PAGE_START;

        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        cont.add(c, gbc);
    }
}[/HIGHLIGHT]

Zu deinen Fragen:


ernst hat gesagt.:


> Hallo allerseits,
> 1)
> ...
> Unklar ist mir noch, was bedeutet:
> ...


Das ist die Gewichtung von Komponenten. Je größer die Zahl der Gewichtung, um so größer ist deren Berücksichtigung bei der Einräumung von Platz im Layout.



ernst hat gesagt.:


> 2)
> Desgleichen ergibt
> addiereKopmonente(myPanel,  gbl, myb4, 0, 2, 3, 1, 1, 1);
> und
> ...


Nichts, es ist schlichtweg falsch. Dem Panel wird nur ein LayoutManager zugewiesen. der Rest ist Aufgabe der GridBagConstraints. 
Außerdem kannst du die Komponenten nicht auf mehr Zellen verteilen, als bereits durch Komponenten belegt sind. Wenn du einen Wert für gridwidth von 5 festlegst, aber nur 2 Komponenten in X-Achse angelegt hast, werden die nicht auf 5 Zellen verteilt werden können. So viele sind bis zu diesen Zeitpunkt nicht vorhanden.



ernst hat gesagt.:


> 3)
> In meinem Demoprogramm (3 Spalten x 5 Zeilen) wird auf dem Bildschirm folgendes Fenster ausgegeben:
> 
> [Bild siehe oben]
> ...


Die Gewichtung, die Ausdehnung von Komponenten über Zellen hinweg (gridwidth und gridheight) und die GridBagConstraints-Variable _fill_, die je nach ihrem Wert und der Gewichtung die Komponente "aufbläst".



ernst hat gesagt.:


> 4)
> Mein späteres Ziel ist eigentlich folgendes:
> ...
> Wie kann ich innerhalb eines GridBagLayout die Größen festlegen?


So, wie ich es dir im Code bereits gezeigt habe.


----------



## ernst (10. Mrz 2009)

Danke für deine Infos.

1) 
ich glaube, dass ich die Logik von GridBagLayout - nach deinen hilfreichen Erklärungen - jetzt einigermassen verstanden habe, aber ich habe mich darüber bei "Java ist auch eine Insel" informiert. Ich vermute, dass die Infos da nicht so stimmen ... (falsch sind).

2)
In dem Programm unten lasse ich ein paar Autos über den Bildschirm fahren.
Das Layout habe ich mit GridbagLayout gemacht.
Das Fenster besteht aus einem großen Rechteck (Zeichenbereich), in der ich die Autos male.
Darunter befindet sich ein Schieberegler und ein Button.
Damit ich den Zeichenbereich bekomme, habe ich folgendes gemacht:
//addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
und dann für den Schieberegler und den Button:
addiereKopmonente(gbl, slider, 0, 5, 1, 1, 1, 0);
addiereKopmonente(gbl, buttonChangeWagen, 1, 5, 1, 1, 0, 0);

Funktioniert einwandfrei, nur:
Warum klappt es nicht, wenn ich 
addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
nehme, aber warum klappt es, wenn ich 
addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
nehme?
Was wird bei einem Label anders gemacht?

3)
In der Methode 
public void addiereKopmonente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){
wird jedesmal intern mit
GridBagConstraints gbc = new GridBagConstraints();
ein neues gbc erzeugt.
Muss es jedesmal ein neues sein.
Was passiert, wenn man jedesmal das Gleiche nimmt?

mfg
Ernst

---------------------------------------------------------------------
[HIGHLIGHT="Java"]package wagen5;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

public class MainWagen5 {
    public static void main(String[] args){
        int l=1000;
        int b = 700;
        int i=1;
        //private GridLayout myGL13;
        //GridBagLayout gbl=new GridBagLayout();
        StrasseZeichenflaeche wzf = new StrasseZeichenflaeche(l, b);
        //wzf.setLayout(gbl);
        JFrame f = new JFrame();
        f.setSize(l, b);

        f.getContentPane().add(wzf);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

        while(i<=10000){
            try{
                Thread.sleep(100);
            }
            catch(Exception e){}
            i++;


            MyRunnable myR = new MyRunnable(wzf);
            javax.swing.SwingUtilities.invokeLater(myR);
        }
    }
}[/HIGHLIGHT]


[HIGHLIGHT="Java"]class Wagen{
    Color farbe;
    private int ortX;
    private int ortY;
    private int groesse;
    private int schritt;
    // Man könnte die Strassenlänge auch über eine bidirektionale Assoziation
    // realisieren, d.h.
    // private StrasseZeichenflaeche s;
    private static int strassenlaenge;

    public Wagen(Color pFarbe, int pOrtX, int pOrtY, int pGroesse){
        farbe = pFarbe;
        ortX = pOrtX;
        ortY = pOrtY;
        groesse = pGroesse;
        schritt = 0;
    }

    public static void setStrassenlaenge(int pLaenge){
        strassenlaenge = pLaenge;
    }

    void fahren(){
        if(ortX <= strassenlaenge){
            ortX = ortX + schritt;
        }
        else{
            ortX=0;
        }
    }

    void setSchritt(int pSchritt){
        schritt = pSchritt;
    }

    //void zeichneAuto(int ortX, int ortY, int groesse, Graphics g){
    void zeichneAuto(Graphics g){
        int x2 = ortX + groesse;    // Größe = Länge = x2-ortX
        int y2 = ortY + groesse/2;  // Höhe = y2-ortY
        int x3 = x2 - groesse/4;    // Fenster
        int y3 = y2 - groesse/4;
        int r = groesse/8;            // RadRadius
        int x4 = ortX + 19 + r/2;     // Hinterrad
        int x5 = x2 - 19 - r/2;       // Vorderrad

        // Karosserie
        g.setColor(farbe);
        g.drawRect(ortX, ortY, groesse, groesse/2);
        g.fillRect(ortX, ortY, groesse, groesse/2);

        // Fenster
        g.setColor(Color.BLACK);
        g.drawRect(x3-1, ortY-1, groesse/4+1, groesse/4+1);
        g.setColor(Color.WHITE);
        g.fillRect(x3, ortY, groesse/4, groesse/4);

        // Hinterrad
        g.setColor(Color.BLACK);
        //g.drawOval(ortX, y2-r, 2*r, 2*r);
        g.fillOval(ortX, y2-r, 2*r, 2*r);

        // Vorderrad
        //g.drawOval(x2-2*r, y2-r, 2*r, 2*r);
        g.fillOval(x2-2*r, y2-r, 2*r, 2*r);
    }
}[/HIGHLIGHT]


[HIGHLIGHT="Java"]class StrasseZeichenflaeche extends JPanel{
    private Container myCont;
    private GridBagLayout gbl;
    private JButton buttonChangeWagen;
    private MyWanzeButtonChangeWagen wanzeButtonChangeWagen;
    // Schieberegler
    private JSlider slider;
    // Wanze am Schieberegler
    private MyWanzeSlider wanzeSlider;
    // Wagen auf der Strasse
    private Wagen wagen1;
    private Wagen wagen2;
    private int xpAnz; // Strassenlänge
    private int ypAnz; // Strassenbreite
    // Bild, in das der Wagen gemalt wird
    private Image myimg;
    private Graphics myg;

    public StrasseZeichenflaeche(int xpAnz, int ypAnz){
        //myCont = new Container();
        gbl = new GridBagLayout();;
        buttonChangeWagen = new JButton("^");
        slider = new JSlider();

        wanzeButtonChangeWagen = new MyWanzeButtonChangeWagen();
        buttonChangeWagen.addActionListener(wanzeButtonChangeWagen);

        //addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, slider, 0, 5, 1, 1, 1, 0);
        addiereKopmonente(gbl, buttonChangeWagen, 1, 5, 1, 1, 0, 0);

        wanzeSlider = new MyWanzeSlider();

        slider.setMinimum(0);
        slider.setMaximum(100);
        slider.setValue(0);
        slider.setOrientation(JSlider.HORIZONTAL);
        slider.setPaintLabels(true);
        slider.setPaintTicks(true);
        slider.setMajorTickSpacing(10 );
        slider.addChangeListener (wanzeSlider);
        Hashtable labelTable = new Hashtable();
        labelTable.put(new Integer(50), new JLabel("50"));
        labelTable.put(new Integer(100), new JLabel("100"));
        slider.setLabelTable(labelTable);
        setLayout(gbl);

        wagen1 = new Wagen(Color.RED, 0, 0, 100);
        wagen2 = new Wagen(Color.BLUE, 0, 70, 100);
        wagen1.setSchritt(0);
        wagen2.setSchritt(0);

        this.xpAnz=xpAnz;
        this.ypAnz=ypAnz;
        // Strassenlänge für alle Wagen setzen !!!
        Wagen.setStrassenlaenge(xpAnz);
    }

    public void setWagen1(Wagen pWagen){
        wagen1 = pWagen;
    }

    public Wagen getWagen1(){
        return (wagen1);
    }

    public void setWagen2(Wagen pWagen){
        wagen2 = pWagen;
    }

    public Wagen getWagen2(){
        return (wagen2);
    }


    public MyWanzeSlider getWanzeSlider(){
        return (wanzeSlider);
    }

    public MyWanzeButtonChangeWagen getWanzeButtonChangeWagen(){
        return (wanzeButtonChangeWagen);
    }

    // ist im EDT (siehe Methode void run)
    public void maleInsBild(){
        int sx, sy;
        if(myimg==null){
            sx = this.getSize().width;
            sy = this.getSize().height;
            myimg = createImage(sx, sy);
            myg = myimg.getGraphics();
        }
        wagen1.zeichneAuto(myg);
        wagen2.zeichneAuto(myg);
    }

    // ist im EDT
    public void paintComponent(Graphics g){
        // Lesezugriff auf myimg
	g.drawImage(myimg,0,0,null);
        // Bild löschen
        myimg=null;
    }

    public void addiereKopmonente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        // Am Layout Manager Constraint für z.B. Button anmelden.
        gbl.setConstraints(c, gbc);
        add(c);
    }

}[/HIGHLIGHT]


[HIGHLIGHT="Java"]class MyRunnable implements Runnable{
    private StrasseZeichenflaeche wzf;
    //private int wert=0;

    public void run(){
        // ist im EDT
        int wert;
        int aktuelleWagennummer;
        wert=wzf.getWanzeSlider().getWert();
        aktuelleWagennummer=wzf.getWanzeButtonChangeWagen().getAktuelleWagennummer();

        if(aktuelleWagennummer==0)
            wzf.getWagen1().setSchritt(wert);
        else
            wzf.getWagen2().setSchritt(wert);
        // Wagen fahren
        wzf.getWagen1().fahren();
        wzf.getWagen2().fahren();
        // Schreibzugriff auf mying
        wzf.maleInsBild();
        // Lesezugriff auf mying in paintComponent
        wzf.repaint();
    }

    public MyRunnable(StrasseZeichenflaeche pWzf){
        wzf = pWzf;
    }
}[/HIGHLIGHT]

[HIGHLIGHT="Java"]class MyWanzeSlider implements ChangeListener {
    private int wert;
    public void stateChanged (ChangeEvent e) {
        JSlider s = (JSlider)(e.getSource ());
        wert = s.getValue();
        System.out.println("Neuer Wert: "+wert);
    }

    // vom Anwender eingestellte Wert des Schieberedisters
    public int getWert(){
        return(wert);
    }
}[/HIGHLIGHT]

[HIGHLIGHT="Java"]class MyWanzeButtonChangeWagen implements ActionListener {
    private static int aktuelleWagennummer;
//  private MyFenster myfVerweis;

  // Konstruktor

    public void actionPerformed (ActionEvent myae) {
        aktuelleWagennummer++;
        aktuelleWagennummer = aktuelleWagennummer %2;
        System.out.println("atuelle= "+aktuelleWagennummer);
      }

    public int getAktuelleWagennummer(){
        return(aktuelleWagennummer);
    }

}[/HIGHLIGHT]


---------------------------------------------------------------------


----------



## L-ectron-X (11. Mrz 2009)

ernst hat gesagt.:


> Ich vermute, dass die Infos da nicht so stimmen ... (falsch sind).


Wie kommst du zu dieser Vermutung?



ernst hat gesagt.:


> 2)
> Warum klappt es nicht, wenn ich
> addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
> nehme, aber warum klappt es, wenn ich
> ...


Was genau klappt nicht?



ernst hat gesagt.:


> 3)
> ...wird jedesmal intern mit
> GridBagConstraints gbc = new GridBagConstraints();
> ein neues gbc erzeugt.
> ...


Dann musst du jedes Mal die benutzten Werte zurücksetzen, wenn sie nicht für diese Komponente gebraucht werden. Ich bevorzuge diese Variante. Aber die andere (mit immer neuem GBC-Objekt) ist nicht verkehrt.


----------



## Ebenius (11. Mrz 2009)

Zum Ausprobieren bin ich zu faul und weise deswegen nur darauf hin, dass JButtons einen Rahmen haben und daher im leeren Zustand um einiges größer (höher und breiter) sind als JLabels.

Ebenius


----------



## ernst (11. Mrz 2009)

1)
>Wie kommst du zu dieser Vermutung?
>
Unter 
Galileo Computing :: Java ist auch eine Insel – 15.10 Alles Auslegungssache: die Layoutmanager
wird behauptet, dass der folgende Code diese Abbildung (siehe letztes Posting) auf dem Bildschirm darstellt:
 addComponent( c, gbl, new JButton("1"), 0, 0, 2, 2, 1.0, 1.0 ); 
    addComponent( c, gbl, new JButton("2"), 2, 0, 1, 1, 0  , 1.0 ); 
    addComponent( c, gbl, new JButton("3"), 2, 1, 1, 1, 0  , 0   ); 
    addComponent( c, gbl, new JButton("4"), 0, 2, 3, 1, 0  , 1.0 ); 
    addComponent( c, gbl, new JButton("5"), 0, 3, 2, 1, 0  , 0   ); 
    addComponent( c, gbl, new JButton("6"), 0, 4, 2, 1, 0  , 0   ); 
    addComponent( c, gbl, new JButton("7"), 2, 3, 1, 2, 0  , 0   ); 

Das ist falsch!

2)
>Was genau klappt nicht?
>
Bei einem Button
addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
...
sieht man die gemalten Bilder _nicht_auf dem Bildschirm, aber bei einem Label 
addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
...
sieht man die gemalten Bilder auf dem Bildschirm, 
Was wird bei einem Label anders gemacht?

mfg
Ernst


----------



## L-ectron-X (11. Mrz 2009)

???:L welche gemalten Bilder?


----------



## ernst (11. Mrz 2009)

L-ectron-X hat gesagt.:


> ???:L welche gemalten Bilder?



siehe das komplette Programm am Ende meines vorletzten Postings

mfg
Ernst


----------



## L-ectron-X (11. Mrz 2009)

Du benutzt doch da das gleiche fehlerhafte Fragment, wie in deinem Eingangspost.
Baue das erst mal um, auf den Vorschlag von mir. Dann sehen wir weiter.


----------



## ernst (11. Mrz 2009)

L-ectron-X hat gesagt.:


> Du benutzt doch da das gleiche fehlerhafte Fragment, wie in deinem Eingangspost.
> Baue das erst mal um, auf den Vorschlag von mir. Dann sehen wir weiter.



Das folgende Programm (habe dein Programm etwas abgeändert) erzeugt die Buttons  (siehe Abbildung Ursprungsposting) und funktioniert einwandfrei.
Was ist deiner Meinung daran falsch?

mfg
Ernst

[HIGHLIGHT="Java"]package gridbaglayout1;
import java.awt.*;

import javax.swing.*;

// Hier wird ein Objekt der selbstgebastelten Klasse MyFenster erzeugt
public class MainGridBagLayout1 {
	public static void main(String[] args) {
		MyFenster myf = new MyFenster();
		myf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}


//Ein Frame ist ein Fenster bzw. Fenstersegment
//Es ist nach seiner Erzeugung zuerst anfänglich unsichtbar
//Hier wird die von JFrame abgeleitete Klasse MyFenster gebastelt, die
//damit die ganze Leistungsfähigkeit von JFrame erbt.
class MyFenster extends JFrame{
	// Stelle in MyFenster deklarieren, an die montiert wird.
	private Container mycont;
	private JButton myb1, myb2, myb3, myb4, myb5, myb6, myb7;

	private JPanel myPanel;
	private GridBagLayout gbl;


	// Konstruktor
	public MyFenster(){
		// Liefert die Stelle in MyFenster, an die montiert wird.
		mycont = getContentPane();
		myPanel=new JPanel();
		myb1=new JButton("B1");
		myb2=new JButton("B2");
		myb3=new JButton("B3");
		myb4=new JButton("B4");
		myb5=new JButton("B5");
		myb6=new JButton("B6");
		myb7=new JButton("B7");
		gbl = new GridBagLayout();
        myPanel.setLayout(gbl);

        addiereKopmonente(myPanel, myb1, 0, 0, 1, 2, 1, 1);
        // weightx = 3 bedeutet, dass Buttom myb1 dreimal so breit ist
        // wie myb1
        addiereKopmonente(myPanel, myb2, 1, 0, 1, 1, 3, 1);
        addiereKopmonente(myPanel, myb3, 1, 1, 1, 1, 1, 1);
        addiereKopmonente(myPanel, myb4, 0, 2, 2, 1, 1, 1);
        addiereKopmonente(myPanel, myb5, 0, 3, 1, 1, 1, 1);
        addiereKopmonente(myPanel, myb6, 0, 4, 1, 1, 1, 1);
        addiereKopmonente(myPanel, myb7, 1, 3, 1, 2, 1, 1);


//		mycont.add(myPanel, BorderLayout.CENTER);
		mycont.add(myPanel);

        // Fensterüberschrift festlegen
		setTitle("Meine Zeichnung");
		// Koordinaten des linken, oberen Ecks des Fensters festlegen
		// Koordinate x = 30, Koordinate y = 60.
		setLocation(30,60);
		// Die Breite des Fensters in x-Richtung = 600
		// Die Breite des Fensters in y-Richtung = 400
		setSize(600,400);
		// Macht das Fenster sichtbar
		setVisible(true);
	}

    public void addiereKopmonente(Container cont, Component c, int x, int y, int width, int height, double weightx, double weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        // Eventueller Freiraum durch Vergrößern der Komponenten in
        // x-Richtung und y-Richtung ausgefüllt.
        gbc.fill = GridBagConstraints.BOTH;
        // Eventueller Freiraum nur durch Vergrößern der Komponenten in
        // x-Richtung ausgefüllt.
        // gbc.fill = GridBagConstraints.HORIZONTAL;
        // Eventueller Freiraum wird nicht ausgefüllt durch Vergrößern der
        // Komponenten
        //gbc.fill = GridBagConstraints.NONE;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
		cont.add(c, gbc);
    }

}[/HIGHLIGHT]


----------



## Ebenius (11. Mrz 2009)

ernst, bitte den Quelltext selber formatieren; also so: [noparse][Java]Quelltext[/Java][/noparse]!

Ebenius


----------



## L-ectron-X (11. Mrz 2009)

Oder den Quelltext mit der Maus markieren und danach das Java-Logo (dampfende Tasse) im Editor anklicken.

Verstehe ich jetzt nicht. Wenn alles funktioniert, wie du es dir vorstellst, warum soll ich dann nach Fehlern suchen? ???:L


----------



## ernst (11. Mrz 2009)

L-ectron-X hat gesagt.:


> Oder den Quelltext mit der Maus markieren und danach das Java-Logo (dampfende Tasse) im Editor anklicken.
> 
> Verstehe ich jetzt nicht. Wenn alles funktioniert, wie du es dir vorstellst, warum soll ich dann nach Fehlern suchen? ???:L



Das Programm A mit meinen Buttons (in meinem letzten Posting) funktioniert. 
Das Programm B, das etwas zeichnet funktioniert genauso, wenn ich nur die Anordnung der Buttons anschaue und _nichts_ in das Panel male.
Da B genaus so wie A aufgebaut ist, kann es also an meinem Layout nicht liegen.

Bei B habe ich aber noch etwas in mein Panel _gemalt_.
Und deshalb vermute ich, dass es daran liegt:
Es wird nichts auf den Button gemalt, aber auf ein Label (vielleicht, weil es sehr klein und unsichtbar ist).

mfg
Ernst


----------



## Ebenius (11. Mrz 2009)

GridBagLayout interessiert sich für die PreferredSize und die MinimumSize der Komponenten. PreferredSize und MinimumSize unterscheiden sich zwischen den Komponenten, üblicher Weise abhängig von deren Inhalt. Es sei denn, diese Größen sind explizit gesetzt. Also: Andere Andere Komponenten oder anderer Inhalt führt zu anderem Layout des Parents.

Ebenius


----------



## ernst (12. Mrz 2009)

Ebenius hat gesagt.:


> GridBagLayout interessiert sich für die PreferredSize und die MinimumSize der Komponenten. PreferredSize und MinimumSize unterscheiden sich zwischen den Komponenten, üblicher Weise abhängig von deren Inhalt. Es sei denn, diese Größen sind explizit gesetzt. Also: Andere Andere Komponenten oder anderer Inhalt führt zu anderem Layout des Parents.
> Ebenius



Habe folgendes eingefügt:
JButton jb = new JButton();
jb.setPreferredSize(new Dimension());
addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);

und dann noch am Anfang den JFrame "gepackt":
f.pack()
Programm funktionierte nicht mehr (Viele Exceptions, Rekursionen?)
Musste es mit dem Task-manager beeden.

Ansonsten habe ich das Programm (siehe oben) belassen.


mfg
Ernst


----------



## L-ectron-X (12. Mrz 2009)

Sicher, dass das so in der Java-Insel steht? Mach das mal nicht so:
[HIGHLIGHT="Java"]addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);[/HIGHLIGHT]
sondern so, wie ich das oben gezeigt habe:
[HIGHLIGHT="Java"]addiereKopmonente(myPanel, jb, 0, 0, 2, 5, 1, 1);[/HIGHLIGHT]

Edit: Und dann ändere doch endlich mal den Methodennamen, der macht mich ganz konfus.


----------



## ernst (12. Mrz 2009)

L-ectron-X hat gesagt.:


> Sicher, dass das so in der Java-Insel steht? Mach das mal nicht so:
> [HIGHLIGHT="Java"]addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);[/HIGHLIGHT]
> sondern so, wie ich das oben gezeigt habe:
> [HIGHLIGHT="Java"]addiereKopmonente(myPanel, jb, 0, 0, 2, 5, 1, 1);[/HIGHLIGHT]
> ...



1) Welchen Methodennamen soll ich wählen?

2) Kannst du mir genau sagen, was an meiner Methode
addiereKopmonente
in meinem _funktionierenden_ Programm unten falsch sein soll?
(beziehe dich nur auf das Layout, weil das Programm relativ groß ist).
gbl befindet sich bei mir als Attribut  in einem JPanel, deshalb gehe ich anders vor als du:
--- 
gbl = new GridBagLayout();
...
addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
addiereKopmonente(gbl, slider, 0, 5, 1, 1, 1, 0);
addiereKopmonente(gbl, buttonChangeWagen, 1, 5, 1, 1, 0, 0);
addiereKopmonente(gbl, buttonNeuerWagen, 2, 5, 1, 1, 0, 0);
...
setLayout(gbl);
----

mfg
Ernst


[HIGHLIGHT="Java"]
package wagen7;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.util.ArrayList;
import java.util.ListIterator;

public class MainWagen7 {
    public static void main(String[] args){
        int l=1000;
        int b = 700;
        int i=1;
        StrasseZeichenflaeche wzf = new StrasseZeichenflaeche(l, b);
        JFrame f = new JFrame();
        f.setSize(l, b);
        f.getContentPane().add(wzf);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);

        while(i<=10000){
            try{
                Thread.sleep(100);
            }
            catch(Exception e){}
            i++;

            MyRunnable myR = new MyRunnable(wzf);
            javax.swing.SwingUtilities.invokeLater(myR);
        }
    }
}


class Wagen{
    Color farbe;
    private int ortX;
    private int ortY;
    private int groesse;
    private int schritt;
    // Man könnte die Strassenlänge auch über eine bidirektionale Assoziation
    // realisieren, d.h.
    // private StrasseZeichenflaeche s;
    private static int strassenlaenge;

    public Wagen(Color pFarbe, int pOrtX, int pOrtY, int pGroesse){
        farbe = pFarbe;
        ortX = pOrtX;
        ortY = pOrtY;
        groesse = pGroesse;
        schritt = 0;
    }

    public void setFarbe(Color pFarbe){
        farbe = pFarbe;
    }

    public static void setStrassenlaenge(int pLaenge){
        strassenlaenge = pLaenge;
    }

    void fahren(){
        if(ortX <= strassenlaenge){
            ortX = ortX + schritt;
        }
        else{
            ortX=0;
        }
    }

    void setSchritt(int pSchritt){
        schritt = pSchritt;
    }

    void zeichneAuto(Graphics g){
        int x2 = ortX + groesse;    // Größe = Länge = x2-ortX
        int y2 = ortY + groesse/2;  // Höhe = y2-ortY
        int x3 = x2 - groesse/4;    // Fenster
        int y3 = y2 - groesse/4;
        int r = groesse/8;            // RadRadius
        int x4 = ortX + 19 + r/2;     // Hinterrad
        int x5 = x2 - 19 - r/2;       // Vorderrad

        // Karosserie
        g.setColor(farbe);
        g.drawRect(ortX, ortY, groesse, groesse/2);
        g.fillRect(ortX, ortY, groesse, groesse/2);

        // Fenster
        g.setColor(Color.BLACK);
        g.drawRect(x3-1, ortY-1, groesse/4+1, groesse/4+1);
        g.setColor(Color.WHITE);
        g.fillRect(x3, ortY, groesse/4, groesse/4);

        // Hinterrad
        g.setColor(Color.BLACK);
        //g.drawOval(ortX, y2-r, 2*r, 2*r);
        g.fillOval(ortX, y2-r, 2*r, 2*r);

        // Vorderrad
        //g.drawOval(x2-2*r, y2-r, 2*r, 2*r);
        g.fillOval(x2-2*r, y2-r, 2*r, 2*r);
    }
}


class StrasseZeichenflaeche extends JPanel{
    private Container myCont;
    private GridBagLayout gbl;
    private JButton buttonChangeWagen;
    private JButton buttonNeuerWagen;
    private MyWanzeButtonChangeWagen wanzeButtonChangeWagen;
    private MyWanzeButtonNeuerWagen wanzeButtonNeuerWagen;
    private ArrayList <Wagen> wagenListe;

    // Schieberegler
    private JSlider slider;
    // Wanze am Schieberegler
    private MyWanzeSlider wanzeSlider;
    private int xpAnz; // Strassenlänge
    private int ypAnz; // Strassenbreite
    // Bild, in das der Wagen gemalt wird
    private Image myimg;
    private Graphics myg;


    public StrasseZeichenflaeche(int xpAnz, int ypAnz){
        gbl = new GridBagLayout();
        buttonChangeWagen = new JButton("^");
        buttonNeuerWagen = new JButton("neu");
        slider = new JSlider();
        wanzeButtonNeuerWagen = new MyWanzeButtonNeuerWagen();
        wanzeButtonChangeWagen = new MyWanzeButtonChangeWagen(wanzeButtonNeuerWagen);


        buttonChangeWagen.addActionListener(wanzeButtonChangeWagen);
        buttonNeuerWagen.addActionListener(wanzeButtonNeuerWagen);
        wagenListe = wanzeButtonNeuerWagen.getWagenListe();

//        JButton jb = new JButton();
//        jb.setPreferredSize(new Dimension());
//        addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, slider, 0, 5, 1, 1, 1, 0);
        addiereKopmonente(gbl, buttonChangeWagen, 1, 5, 1, 1, 0, 0);
        addiereKopmonente(gbl, buttonNeuerWagen, 2, 5, 1, 1, 0, 0);


        wanzeSlider = new MyWanzeSlider();

        slider.setMinimum(0);
        slider.setMaximum(100);
        slider.setValue(0);
        slider.setOrientation(JSlider.HORIZONTAL);
        slider.setPaintLabels(true);
        slider.setPaintTicks(true);
        slider.setMajorTickSpacing(10 );
        slider.addChangeListener (wanzeSlider);
        Hashtable labelTable = new Hashtable();
        labelTable.put(new Integer(50), new JLabel("50"));
        labelTable.put(new Integer(100), new JLabel("100"));
        slider.setLabelTable(labelTable);
        setLayout(gbl);

        this.xpAnz=xpAnz;
        this.ypAnz=ypAnz;
        // Strassenlänge für alle Wagen setzen !!!
        Wagen.setStrassenlaenge(xpAnz);
    }


    public MyWanzeButtonNeuerWagen getMyWanzeButtonNeuerWagen(){
        return wanzeButtonNeuerWagen;
    }

    public void setWagenListe (ArrayList <Wagen> pWagenListe){
        wagenListe = pWagenListe;
    }

    public ArrayList getWagenListe(){
        return (wagenListe);
    }

    public Wagen getWagen(int i){
        return (wagenListe.get(i));
    }


    public MyWanzeSlider getWanzeSlider(){
        return (wanzeSlider);
    }

    public MyWanzeButtonChangeWagen getWanzeButtonChangeWagen(){
        return (wanzeButtonChangeWagen);
    }

    // ist im EDT (siehe Methode void run)
    public void maleInsBild(){
        int i;
        int sx, sy;
        if(myimg==null){
            sx = this.getSize().width;
            sy = this.getSize().height;
            myimg = createImage(sx, sy);
            myg = myimg.getGraphics();
        }

        for(i=0; i<wanzeButtonNeuerWagen.getWagenListe().size(); i++)
            wanzeButtonNeuerWagen.getWagenListe().get(i).zeichneAuto(myg);

    }


    public void paintComponent(Graphics g){
    	g.drawImage(myimg,0,0,null);
        // Bild löschen
        myimg=null;
    }

    public void addiereKopmonente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        // Beschränkung fürKomponente c (z.B. Button)am Layout-Manager anmelden.
        gbl.setConstraints(c, gbc);
        add(c);
    }
}


class MyRunnable implements Runnable{
    private StrasseZeichenflaeche wzf;

    public void run(){
         int i;
        int wert;
        int aktuelleWagennummer;
        int wagenListeLaenge;
        wagenListeLaenge = wzf.getWagenListe().size();
        wert=wzf.getWanzeSlider().getWert();
        aktuelleWagennummer=wzf.getWanzeButtonChangeWagen().getAktuelleWagennummer();
        // Schrittweite eines Wagens setzen
        System.out.println("aktuelleWagennummer = "+aktuelleWagennummer);
        if(wagenListeLaenge != 0)
            wzf.getWagen(aktuelleWagennummer).setSchritt(wert);
        // Wagen fahren
        for(i=0; i<wagenListeLaenge; i++)
            wzf.getWagen(i).fahren();
         wzf.maleInsBild();
         wzf.repaint();
    }

    public MyRunnable(StrasseZeichenflaeche pWzf){
        wzf = pWzf;
    }
}

class MyWanzeSlider implements ChangeListener {
    private int wert;
    public void stateChanged (ChangeEvent e) {
        JSlider s = (JSlider)(e.getSource ());
        wert = s.getValue();
        System.out.println("Neuer Wert: "+wert);
    }

    // vom Anwender eingestellte Wert des Schieberedisters
    public int getWert(){
        return(wert);
    }
}

class MyWanzeButtonChangeWagen implements ActionListener {
    private static int aktuelleWagennummer;
    private MyWanzeButtonNeuerWagen wanzeButtonNeuerWagen;

    public MyWanzeButtonChangeWagen(MyWanzeButtonNeuerWagen pw){
        wanzeButtonNeuerWagen = pw;
    }

    public void actionPerformed (ActionEvent myae) {
        int len;
        len = wanzeButtonNeuerWagen.getWagenListe().size();
        aktuelleWagennummer++;
        //aktuelleWagennummer = aktuelleWagennummer %2;
        if(len==0)
            aktuelleWagennummer=0;
        else
            aktuelleWagennummer = aktuelleWagennummer % len;
        System.out.println("atuelle= "+aktuelleWagennummer);
      }

    public int getAktuelleWagennummer(){
        return(aktuelleWagennummer);
    }

    public int getWagenListeLaenge(){
        return(aktuelleWagennummer);
    }


}

class MyWanzeButtonNeuerWagen implements ActionListener {
    private static int i = 0;
    static private ArrayList <Wagen> wagenListe = new ArrayList <Wagen>();

    public void actionPerformed (ActionEvent myae) {
        Color farbe = new Color(i*6789+1234);
        //Wagen tempwagen = new Wagen(Color.YELLOW, 0, 70*i, 100);
        Wagen tempwagen = new Wagen(farbe, 0, 70*i, 100);
        tempwagen.setSchritt(0);
        wagenListe.add(tempwagen);
        i++;
        System.out.println("Länge = "+wagenListe.size());
      }

    public ArrayList <Wagen> getWagenListe(){
        return(wagenListe);
    }



}

[/HIGHLIGHT]


----------



## ernst (13. Mrz 2009)

L-ectron-X hat gesagt.:


> Du sollst ja auch nicht das verkehrte Zeug von der Java-Insel
> [HIGHLIGHT="Java"]addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);[/HIGHLIGHT]
> benutzen sondern das, was ich dir gezeigt habe:
> [HIGHLIGHT="Java"]addiereKopmonente(myPanel, jb, 0, 0, 2, 5, 1, 1);[/HIGHLIGHT]
> ...



Hier ein einfaches Beispiel, das auch funktioniert, aber sich von deinem unterscheidet:

mfg
Ernst

[HIGHLIGHT="Java"]
package gridbaglayout3;
import java.awt.*;
import javax.swing.*;
import java.util.*;


public class MainGridBagLayout3 {
    public static void main(String[] args) {
        int l=1000;
        int b = 700;
        StrasseZeichenflaeche wzf = new StrasseZeichenflaeche(l, b);
        JFrame f = new JFrame();
        f.setSize(l, b);
        f.getContentPane().add(wzf);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
  }
}

class StrasseZeichenflaeche extends JPanel{
    private Container myCont;
    private GridBagLayout gbl;
    private JButton button2;
    private JButton button3;

    private JButton button1;
    private int xpAnz; 
    private int ypAnz; 


    public StrasseZeichenflaeche(int xpAnz, int ypAnz){
        gbl = new GridBagLayout();
        button1 = new JButton("B1");
        button2 = new JButton("B2");
        button3 = new JButton("B3");

//        JButton jb = new JButton();
//        jb.setPreferredSize(new Dimension());
//        addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, button1, 0, 5, 1, 1, 1, 0);
        addiereKopmonente(gbl, button2, 1, 5, 1, 1, 0, 0);
        addiereKopmonente(gbl, button3, 2, 5, 1, 1, 0, 0);

        setLayout(gbl);
        this.xpAnz=xpAnz;
        this.ypAnz=ypAnz;
    }


    public void addiereKopmonente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        // Beschränkung fürKomponente c (z.B. Button)am Layout-Manager anmelden.
        gbl.setConstraints(c, gbc);
        add(c);
    }

    public void paintComponent(Graphics g){
        g.drawOval(10, 10, 100, 100);

    }
}
[/HIGHLIGHT]


----------



## L-ectron-X (13. Mrz 2009)

So lange, wie dein Programm mit dem Layout läuft, hast du sicher nicht falsch gemacht.


----------



## ernst (13. Mrz 2009)

L-ectron-X hat gesagt.:


> So lange, wie dein Programm mit dem Layout läuft, hast du sicher nicht falsch gemacht.



Jetzt habe ich eine Kleinigkeit verändert, aber die Ellipse wird nicht mehr gezeichnet:
Statt
addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
habe ich 
addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
geschrieben.

mfg
Ernst

[highlight=Java]
package gridbaglayout3;
import java.awt.*;
import javax.swing.*;
import java.util.*;


public class MainGridBagLayout3 {
    public static void main(String[] args) {
        int l=1000;
        int b = 700;
        StrasseZeichenflaeche wzf = new StrasseZeichenflaeche(l, b);
        JFrame f = new JFrame();
        f.setSize(l, b);
        f.getContentPane().add(wzf);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
  }
}

class StrasseZeichenflaeche extends JPanel{
    private Container myCont;
    private GridBagLayout gbl;
    private JButton button2;
    private JButton button3;

    private JButton button1;
    private int xpAnz; 
    private int ypAnz; 


    public StrasseZeichenflaeche(int xpAnz, int ypAnz){
        gbl = new GridBagLayout();
        button1 = new JButton("B1");
        button2 = new JButton("B2");
        button3 = new JButton("B3");

//        JButton jb = new JButton();
//        jb.setPreferredSize(new Dimension());
//        addiereKopmonente(gbl, jb, 0, 0, 2, 5, 1, 1);
//        addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, new JButton(), 0, 0, 2, 5, 1, 1);
        addiereKopmonente(gbl, button1, 0, 5, 1, 1, 1, 0);
        addiereKopmonente(gbl, button2, 1, 5, 1, 1, 0, 0);
        addiereKopmonente(gbl, button3, 2, 5, 1, 1, 0, 0);

        setLayout(gbl);
        this.xpAnz=xpAnz;
        this.ypAnz=ypAnz;
    }


    public void addiereKopmonente(GridBagLayout gbl, Component c, int x, int y, int width, int height, double weightx, double weighty){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.weightx = weightx;
        gbc.weighty = weighty;
        // Beschränkung fürKomponente c (z.B. Button)am Layout-Manager anmelden.
        gbl.setConstraints(c, gbc);
        add(c);
    }

    public void paintComponent(Graphics g){
        g.drawOval(10, 10, 100, 100);

    }
}
[/highlight]


----------



## L-ectron-X (13. Mrz 2009)

Weil der (nicht durchsichtige) Button auf dem Panel sitzt und damit die darunterliegende Zeichnung verdeckt.


----------



## ernst (13. Mrz 2009)

L-ectron-X hat gesagt.:


> Weil der (nicht durchsichtige) Button auf dem Panel sitzt und damit die darunterliegende Zeichnung verdeckt.



1) Kann man die Zeichnung über den Button setzen? (nicht unter den Button!)
2) Warum ist es beim JLabel anders?
3) Wie kann ich die Zeichnung darstellen, ohne dass sie durch den Button verdeckt wird?

mfg
Ernst


----------



## L-ectron-X (28. Mrz 2009)

Kannst du mal ungefähr andeuten, wohin "die Reise" gehen soll. Sonst wird hier wohl niemend mehr antworten bzw. du bekommst möglicherweise Vorschläge, die dich nicht weiterbringen.


----------



## ernst (28. Mrz 2009)

L-ectron-X hat gesagt.:


> Kannst du mal ungefähr andeuten, wohin "die Reise" gehen soll. Sonst wird hier wohl niemend mehr antworten bzw. du bekommst möglicherweise Vorschläge, die dich nicht weiterbringen.



Es geht mir darum, mehr Verständnis zu bekommen, d.h. zu wissen, an welchen "Knöpfen" ich "drehen" muss, um das Fenster zu manipulieren.
Und dazu dient u.a die Beantwortung dieser 3 Fragen.
Wenn die 3 Fragen beantwortet sind, verspreche ich in diesem Thread nichts mehr dazu zu posten.

mfg
Ernst


----------



## L-ectron-X (28. Mrz 2009)

ernst hat gesagt.:


> 1) Kann man die Zeichnung über den Button setzen? (nicht unter den Button!)


Ja, man könnte auf der GlassPane zeichnen.



ernst hat gesagt.:


> 3) Wie kann ich die Zeichnung darstellen, ohne dass sie durch den Button verdeckt wird?


Wie genau soll das aussehen? Deshalb wollte ich oben wissen, was du vor hast...



ernst hat gesagt.:


> 2) Warum ist es beim JLabel anders?


Dazu bräuchte ich Code zum Vergleichen. Man kann bspw. ein JLabel durchsichtig schalten.


----------



## ernst (29. Mrz 2009)

>3) Wie kann ich die Zeichnung darstellen, ohne dass sie durch den Button verdeckt wird?
>>Wie genau soll das aussehen? Deshalb wollte ich oben wissen, was du vor hast...
>>
Ich will folgendes:
Eine Zeichnung machen (z.B. Autos, die sich von links nach rechts auf dem Bildschrim bewegen.
Zur Manipulation (z.B. neue Autos erzeugen) brauche ich noch ein paar Buttons (die Anordnung habe ich mit gridbagLayout gemacht).
Die Zeichnung und die Buttons dürfen sich nicht in die Quere kommen, d.h. ein Button soll nicht die komplette Zeichnung überdecken. Das ist der Fall, wenn ich Button benutzte statt Label (um mehrere Zellen bei gridbagLayout zu überdecken).
Siehe meinen kompletten Quellcode in meinem letzten Posting auf Seite 1.
Dort ist alles genau beschrieben.

mfg
Ernst


----------



## L-ectron-X (29. Mrz 2009)

Dann musst du dein Layout aufteilen.
In einen Bereich (JPanel/JComponent) auf den zeichnest und einen Bereich (ein oder mehrere JPanels) der die Elemente für Operationen enthält.


----------



## ernst (31. Mrz 2009)

L-ectron-X hat gesagt.:


> Dann musst du dein Layout aufteilen.
> In einen Bereich (JPanel/JComponent) auf den zeichnest und einen Bereich (ein oder mehrere JPanels) der die Elemente für Operationen enthält.



Kann ich es auch so machen, wie in meinem Programm (siehe Seite 1), dass ich mit
addiereKopmonente(gbl, new JLabel(), 0, 0, 2, 5, 1, 1);
...
ein Dummy-Label erzeuge, das nicht angezeigt wird und in diesen Bereich zeichne?

mfg
Ernst


----------



## L-ectron-X (31. Mrz 2009)

Ich denke, das würde auch funktionieren. Am besten, du legst eine feste Größe für dieses Label fest, wenn es geht.


----------



## Developer_X (31. Mrz 2009)

ich sags immer wieder 
"BOUNDS ARE FUTURE"


----------



## Schandro (1. Apr 2009)

> ich sags immer wieder
> "BOUNDS ARE FUTURE"


Jaaa, und OOP ist auch sau schlecht. Lass und mit Assembler programmieren, das ist die Zukunft. 

Das 40:5 Umfrageerbegniss aus diesem Thread:
http://www.java-forum.org/plauderecke/80153-layout-oder-bounds.html
kommt auch nur daher, das alle anderen keine Ahnung haben


----------

