Einfache Frage zu GridBagLayout

Status
Nicht offen für weitere Antworten.

ernst

Top Contributor
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:

Code:
+----------------------+---+
|                      | 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
 
Zuletzt bearbeitet von einem Moderator:

L-ectron-X

Gesperrter Benutzer
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:
Hallo allerseits,
1)
...
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.
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.

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?
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.

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

[Bild siehe oben]

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?
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".

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.
 
Zuletzt bearbeitet:

ernst

Top Contributor
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]


---------------------------------------------------------------------
 
Zuletzt bearbeitet von einem Moderator:

L-ectron-X

Gesperrter Benutzer
Ich vermute, dass die Infos da nicht so stimmen ... (falsch sind).
Wie kommst du zu dieser Vermutung?

2)
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?
Was genau klappt nicht?

3)
...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?
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.
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
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

Top Contributor
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

Gesperrter Benutzer
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

Top Contributor
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]
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

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

Ebenius
 

L-ectron-X

Gesperrter Benutzer
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

Top Contributor
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

Top Contributor
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

Top Contributor
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

Gesperrter Benutzer
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

Top Contributor
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.

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

Top Contributor
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]

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

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]
 

ernst

Top Contributor
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

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

ernst

Top Contributor
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

Gesperrter Benutzer
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

Top Contributor
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

Gesperrter Benutzer
1) Kann man die Zeichnung über den Button setzen? (nicht unter den Button!)
Ja, man könnte auf der GlassPane zeichnen.

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...

2) Warum ist es beim JLabel anders?
Dazu bräuchte ich Code zum Vergleichen. Man kann bspw. ein JLabel durchsichtig schalten.
 

ernst

Top Contributor
>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

Gesperrter Benutzer
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

Top Contributor
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

Gesperrter Benutzer
Ich denke, das würde auch funktionieren. Am besten, du legst eine feste Größe für dieses Label fest, wenn es geht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
L Einfache Layout Frage für Applet -> Was mache ich bloss falsch? AWT, Swing, JavaFX & SWT 2
E Swing Einfache Frage zu JMenu AWT, Swing, JavaFX & SWT 4
E einfache Frage zu invokeLater() AWT, Swing, JavaFX & SWT 4
E Einfache Frage zu GridLayout AWT, Swing, JavaFX & SWT 35
M einfache Frage über SWT GUI-Programmierung AWT, Swing, JavaFX & SWT 3
S Einfache Thread-Frage AWT, Swing, JavaFX & SWT 3
G Einfache Frage Panel AWT, Swing, JavaFX & SWT 5
Jose05 einfache GUI mit schwarzem Feld AWT, Swing, JavaFX & SWT 12
X JavaFX Einfache FX Application, aber wie alte Features umgehen? AWT, Swing, JavaFX & SWT 10
B AWT einfache Stoppuhr -Verbesserungsvorschläge AWT, Swing, JavaFX & SWT 2
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
A Einfache Benutzeroberfläche wie realisieren? AWT, Swing, JavaFX & SWT 6
P Swing Einfache Eingabe in JTextfield wird nicht ausgegeben AWT, Swing, JavaFX & SWT 3
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
V Swing Einfache Graphen-Lib? AWT, Swing, JavaFX & SWT 2
A Swing einfache fragen zu frame AWT, Swing, JavaFX & SWT 10
iLoveTheInternet Einfache Grafikausgabe AWT, Swing, JavaFX & SWT 2
B Einfache jpg-Bilder anzeigen AWT, Swing, JavaFX & SWT 8
H einfache Buttonanzeige AWT, Swing, JavaFX & SWT 2
M Einfache Möglichkeit einen Login Dialog zu bauen? AWT, Swing, JavaFX & SWT 1
G Einfache Text formatierung? Wie? AWT, Swing, JavaFX & SWT 4
O Suche einfache Möglichkeit zum Speichern AWT, Swing, JavaFX & SWT 21
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen


Oben