Wieso schaltet meine CheckBox von selbst um ?

Status
Nicht offen für weitere Antworten.

Kanitrino

Bekanntes Mitglied
Hallo, Experten des Java,

Ich habe eine CheckBox in meine GUI eingebaut und diese lehrbuchgemäß mittels eines ItemListeners in das Programm eingebunden.

Wenn ich sie nun währen der Laufzeit aktiviere bzw. desaktiviere, verschwindet bzw. erscheint das Häkchen von selbst wieder. Eine print-Anweisung im ItemListener zeigt, dass dieser offenbar mehrfach betätigt wird.

Um Programmierfehler auszuschließen, habe ich alle inhaltlichen Bezüge ausgeblendet, bis nur noch das unten wiedergegebene Gerippe stehenblieb. Aber auch ohne jeglichen Inhalt tritt der Fehler unverändert auf. Das muss doch an Java liegen und nicht an mir !! Oder ?

Code:
import java.awt.event.*;
.
.
Checkbox cRiechen = new Checkbox();
.
.
.
cRiechen.addItemListener
    (new ItemListener()  
        {public void itemStateChanged(ItemEvent e)
            {
// hier steht nix !
            }
        }
    );
 

Kanitrino

Bekanntes Mitglied
Tobias,

Ich habe versucht, das Programm zu vereinfachen, um nicht alle > 1000 Zeilen ins Forum stellen zu müssen. Seltsamer Weise funktionierte es dann, egal was ich vereinfachte.

Meine Schlussfolgerung ist, dass das beschriebene Phänomen auf Überlastung zurückzuführen ist. Die CPU arbeitet an der Leistungsgrenze und überschreitet sie manchmal.

Die Lösung besteht offenbar darin, alles ein wenig kleiner zu dimensionieren, damit weniger Rechenaufwand pro Zeiteinheit nötig ist.

Vielen Dank für Deine Mühe. Sie war nicht vergebens, sondern "Hilfe zur Selbsthilfe".
 

Kanitrino

Bekanntes Mitglied
Also, Marco, Du hast es nicht anders gewollt. Ich habe den Code jetzt radikal verstümmelt (es sind aber immer noch über 300 Zeilen), und der Fehler ist noch da. Also : Bitte den Start-Button drücken und dann die CheckBox ein paar Mal betätigen, dann sollte sich zeigen, dass das Häkchen manchmal von selbst wieder verschwindet bzw. auftaucht.
Ich bin mal gespannt, ob Du die Ursache finden kannst.
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class FuchsSimulation extends JFrame
{
	int anzBreite 		= 240;
	int anzHoehe		= 160;
	int pixel		= 3;
	int msec		= 50;

	Brett brett;
	FuchsGUI gui;
	SpielManager manager;
	Container container;

	public FuchsSimulation()
	{
		this.setSize(1000, 650);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		brett	= new Brett(anzBreite, anzHoehe, pixel);
		manager	= new SpielManager(brett, msec);
		gui			= new FuchsGUI(manager);

		container	= getContentPane();
		brett.setBackground(new Color(50, 200, 50));
		container.setLayout(new BorderLayout());
		container.add("Center", brett);
		container.add("East", gui);
	}

	public static void main(String[] args)
	{
		FuchsSimulation fuchs = new FuchsSimulation();
		fuchs.setVisible(true);
	}
}

class FuchsGUI extends JPanel
{
	SpielManager manager;
	int anzPanel = 5;
	Panel[] panel = new Panel[anzPanel];
	JSlider slider1;
	JButton bStart;
	Checkbox cRiechen = new Checkbox();
	boolean check = false;

	public FuchsGUI(SpielManager manager)
	{
		this.manager = manager;
		setKomponenten();
		setPanel();
		setBackground(new Color(50, 200, 50));
		setVisible(true);
	}

	public void setKomponenten()
	{
		cRiechen = new Checkbox("um diese CheckBox geht s", true);
		bStart 	= new JButton(" START ");
		bStart.setBackground(new Color(150, 180, 250));
		slider1 = new JSlider(JSlider.HORIZONTAL, 1, 10, 5);
		slider1.setBackground(new Color(50, 200, 50));

		cRiechen.addItemListener
		(new ItemListener()
			{public void itemStateChanged(ItemEvent e)
				{
					check = !check;
					System.out.println("CheckBox "+check);
				}
			}
		);

		bStart.addActionListener
		(new ActionListener()  // Start-Button
			{public void actionPerformed(ActionEvent e)
				{
					manager.neuStart();
					manager.start();
				}
			}
		);
	}

	public void setPanel()
	{
		for (int i=0; i<anzPanel; i++)
			panel[i] = new Panel();

		panel[0].setLayout(new GridLayout(0,1));
		panel[1].setLayout(new GridLayout(0,1));
		panel[2].setLayout(new GridLayout(0,1));
		panel[3].setLayout(new GridLayout(0,1));
		panel[4].setLayout(new FlowLayout());

		panel[0].add(slider1);
		panel[1].add(cRiechen);
		bStart.setSize(40, 60);
		panel[2].add(bStart);
		panel[3].add(panel[0]);
		panel[3].add(panel[1]);
		panel[3].add(panel[2]);
		add(panel[3]);
	}
}

class SpielManager extends Thread
{
	BrettGrund grund;
	Feld nachbarfeld;
	Brett brett;
	int msec;
	Thread running;
	public SpielManager(Brett brett, int msec)
	{
		this.brett	= brett;
		this.msec	= msec;
	}

	public void start()
	{	if (running == null)
		{	running = new Thread (this);
			running.start();
	}	}


	public void run()
	{
		while(true)
		{
			verzoegerung (msec);
			wandern();
			brett.repaint();
		}
	}

	public void neuStart()
	{
		int i = 0;
		while (i <3000)
		{
			int x = (int)(Math.random()*(double)brett.getAnzBreite());
			int y = (int)(Math.random()*(double)brett.getAnzHoehe());
			if(brett.feld[x][y].getBesetzt()) continue;
			brett.feld[x][y].setBesetzt(true);
			i++;
		}
	}

	public void wandern()
	{
		Feld nachbar = null;

		for (int x=0; x<brett.getAnzBreite(); x++)
		for (int y=0; y<brett.getAnzHoehe(); y++)
		{	if(brett.feld[x][y].getBesetzt()==false) continue;
			nachbar = nachbarfeldLeer(x, y);
			nachbar.setBesetzt(true);
			brett.feld[x][y].setBesetzt(false);
		}
	}

	public Feld nachbarfeldLeer(int x, int y)
	{
		Feld nachbar;

		int nr = (int)(4.*Math.random());
		for(int i=0; i<4; i++)
		{
			nachbar = brett.nachbarfeld(x, y, (nr+i)%4+1);
			if(nachbar.getBesetzt()==false) return nachbar;
		}

		return brett.nachbarfeld(x, y, 0);
	}

	public void verzoegerung (int msec)
	{
		try {Thread.sleep (msec);}
		catch(Exception e){}
	}
}

class Brett extends JPanel
{
	int anzBreite, anzHoehe, pix;
	Feld[][] feld;
	Feld nachbarfeld;

	public Brett(int anzBreite, int anzHoehe, int pix)
	{
		this.anzBreite	= anzBreite;
		this.anzHoehe	= anzHoehe;
		this.pix			= pix;
		Feld.setParameter(pix);
		feld 				= new Feld[anzBreite][anzHoehe];
		neu();
	}

	public void neu()
	{
		for (int x=0; x<anzBreite; x++)
		for (int y=0; y<anzHoehe; y++)
			feld[x][y] = new Feld(x, y);
	}

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		for (int x=0; x<anzBreite; x++)
		for (int y=0; y<anzHoehe; y++)
			feld[x][y].paintComponent(g);
	}

	public Feld nachbarfeld(int x, int y, int nr)
	{
		switch(nr)
		{
			case 0 :
			{
				return feld[x][y];
			}

			case 1 :
			{
				int xx = x+1;
				if(xx > anzBreite-1)	xx = 0;
				return feld[xx][y];
			}

			case 2 :
			{
				int yy = y+1;
				if(yy > anzHoehe-1) yy = 0;
				return feld[x][yy];
			}

			case 3 :
			{
				int xx = x-1;
				if(xx< 0) xx = anzBreite-1;
				return feld[xx][y];
			}

			case 4 :
			{
				int yy = y-1;
				if(yy< 0) yy = anzHoehe-1;
				return feld[x][yy];
			}
		}
		return null;
	}

	int getAnzBreite()
	{
		return anzBreite;
	}

	int getAnzHoehe()
	{
		return anzHoehe;
	}

	public void update (Graphics screen)
	{
		paint (screen);
	}
}

class Feld extends JPanel
{
	private static int pix;
	private int x, y;
	private boolean besetzt;

	public Feld(int x, int y)
	{
		this.x		= x;
		this.y		= y;
	}

	public static void setParameter(int pixel)
	{
		pix	= pixel;
	}

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(new Color(100, 250, 100));
		g.fillRect(10+x*pix, 10+y*pix, pix, pix);
		if(besetzt)
		{
			g.setColor(Color.black);
			g.fillOval(10+x*pix, 10+y*pix, pix, pix);
		}
	}

	public boolean getBesetzt()
	{
		return besetzt;
	}

	public void setBesetzt (boolean besetzt)
	{
		this.besetzt = besetzt;
	}
}
 

Marco13

Top Contributor
Die Zeilen
Code:
public class FuchsSimulation extends JFrame
und
Code:
   Checkbox cRiechen = new Checkbox();
Hätten schon gereicht :wink:

Die Lösung des Problems lautet:
Code:
JJJBJBJBJ

Natürlich an den richtigen Stellen eingesetzt :bae:

Man darf darf (im Allgemeinen) Swing und AWT nicht vermischen. D.h. wenn man einen JFrame hat mit JPanels drin, dann darf man da kein Panel oder Checkbox reintun, sondern muss JPanel und JCheckBox verwenden. Andernfalls kann es seltsame Probleme (wie offenbar auch selbsttätig umschaltende Checkboxes :wink:) geben. Näheres dazu steht auch hier http://java.sun.com/products/jfc/tsc/articles/mixing/

Und noch ein heißer Tipp: Ich weiß zwar nicht, wie viel von diesem Code nur "gehackt" war, um ein kleines, lauffähiges Beispiel hinzukriegen, aber... Du erstellst im Moment für das Spielfeld ca. 40000 Components (die Felder sind alle JPanels)! Eine Component ist nicht nur ein kleines, rechteckiges Ding, sondern ein VERDAMMT komplexes Objekt. In Zeiten wo jeder Rechner mit weniger als 2 GB RAM schon Schrottwert hat, ist der Speicher vielleicht das geringste Problem. Wie VIEL Speicher da verschwendet wird, kann man sich vorstellen, wenn man sich ansieht, woraus eine Component besteht. Das hatte ich mal aufgelistet: http://www.java-forum.org/de/viewtopic.php?p=401218&highlight=#401218

Ein anderer Punkt ist aber auch die Effizienz. (Auch wenn das stark mit dem drawOval zusammenhing). Ändere mal deine Feld-Klasse (ggf. nur zum Testen) folgendermaßen ab, und starte das ganze dann nochmal :cool:

Code:
class Feld
{
   private static int pix = 1;
   private int x, y;
   private boolean besetzt;
   private Color color = new Color(100, 250, 100);

   public Feld(int x, int y)
   {
      this.x      = x*3;
      this.y      = y*3;
   }

   public static void setParameter(int pixel)
   {
      pix   = pixel;
   }

   public void paintComponent(Graphics g)
   {
      //g.setColor(color);
      //g.fillRect(10+x*pix, 10+y*pix, pix, pix);
      if(besetzt)
      {
         g.setColor(Color.black);
         g.drawLine(x,y-1,x,y+1);
         g.drawLine(x-1,y,x+1,y);

         //g.fillOval(10+x*pix, 10+y*pix, pix, pix);
      }
   }

   public boolean getBesetzt()
   {
      return besetzt;
   }

   public void setBesetzt (boolean besetzt)
   {
      this.besetzt = besetzt;
   }
}
 

Marco13

Top Contributor
Ja, da Feld jetzt nichtmehr von Component erbt :wink: Man sollte die Methode dann wohl auch nichtmehr paintComponent nennen, sondern "paintFeld" oder so, aber dann hätte man auch den Aufruf im Spielbrett ändern müssen (es ging ja nur um die Verdeutlichung. Das ist - wenn ich es richtig verstanden habe - ja nicht das "richtige" Programm, sondern eher eine compilierbar gemachte "Demo-Version")
 

Kanitrino

Bekanntes Mitglied
Hallo Marco,

Herzlichen Dank, jetzt klappt es mit der JCheckBox !
(Ich habe auch die Panels gegen JPanels ersetzt)

Allerdings habe ich mir dadurch zwei Bugs eingehandelt :

1. Mit JCheckBox kann man nicht getState() abfragen (eigentlich ein Unding, denn dazu ist sie ja da) - aber ich kann ja stattdessen mit der boolean Variable arbeiten, die durch die JCheckBox per ItemListener verändert wird.
(Ich habe damit mal schlechte Erfahrungen gemacht : Eine Checkbox wurde beim Neustart per Button wieder auf den Ausgangszustand zurückgesetzt, und das hat der ItemListener dann nicht mitgekriegt)

2. Meine GUI hat ihre Hintergrundfarbe verloren, die ich mit setBackground(Color c) in Zeile 55 gesetzt habe. Die Hintergrundfarbe der einzelnen Komponenten (JSlider) ist noch da.

Aber zur Frage nach der ökonomischten Programmierweise :

Die Sache mit den Strichen anstatt fillRect funktioniert im Prinzip, sieht aber umso schlechter aus, je größer die Felder werden. Ich habe es vorgezogen, kein Kreuz in die Mitte des Kästchens zu malen, sondern lieber das Kästchen an zwei Seiten zu umranden, weil es dann weniger von den Kreisen (Füchsen) überdeckt wird.
(Leider sieht man in der Light-Version des Programms nicht, wie das Gras je nach Länge die Farbe wechselt.)

Grundsätzlich bleibt die Frage, ob es eleganter ist, das gesamte Brett von der Klasse Brett zeichnen zu lassen (die vorher die Infos von den Feld-Objekten abfragt), oder aber - wie der jetzige Zustand - jedes Feld einzeln vom jeweiligen Feld-Objekt des Arrays feld[][] malen zu lassen.

Wenn, wie Du darlegst, die Verwendung von vielen JPanels sehr aufwändig ist, wäre ersteres doch wohl sicherlich sparsamer.

(Eine weitere Alternative könnte sein, mit vorgefertigten Quadraten zu arbeiten, die nur noch eingesetzt werden.)
 

Marco13

Top Contributor
1. getState heißte jetzt isSelected - sonst ändert sich nix :wink:
2. Weiß nicht genau, was du meinst - vielleicht noch ein panel[ i ].setOpaque(false); in der Schleife in setPanel?

Zur Frage der "Ökonomie": Was genau die einzelnen Felder zeichnen sollten, weiß ich nicht - gesehen hat man (weil das drawOval so einen kleinen Radius hatte) nur so ein Kreuz, wie ich es dann auch gezeichnet hatte. Wenn du was anderes willst, musst du wissen, WAS, und das dann eben umsetzen.

"mit vorgefertigten Quadraten zu arbeiten" ist nicht so abwegig. Je nachdem, was da am Ende rauskommen soll, KANN es sinnvoll sein, EIN Feld in ein BufferedImage zu zeichnen, und dieses EINE BufferedImage dann von ALLEN Feldern (an "ihrer" Position) zeichnen zu lassen, aber das muss man sich GENAU überlegen....

Grundsätzlich bleibt die Frage, ob es eleganter ist, das gesamte Brett von der Klasse Brett zeichnen zu lassen [...] oder aber - wie der jetzige Zustand - jedes Feld einzeln vom jeweiligen Feld-Objekt des Arrays feld[][] malen zu lassen.

Letzteres ist schon OK. Man könnte zwar u.U. eine sauberere Trennung zwischen den Daten und dem Zeichnen erreichen, vielleicht mit einem "FeldRenderer" oder so, aber ... ich weiß ja nicht, welche Ansprüche du hast.

Das wichtige ist eben, dass Feld NICHT mehr von JPanel erbt, weil dadurch Speicher verschwendet und das Zeichnen sehr aufwändig wird (dafür, dass man eigentlich nur ein paar Striche gezeichnet haben will).
 

Kanitrino

Bekanntes Mitglied
Ich habe ein bisschen gefummelt und bin zu einer Erkenntnis gelangt.

Es ist so : Wenn ich die Panels in JPanels ändere (Zeilen 44 und 91), hat im Originalprogramm die GUI mit Slider, Checkbox und Button am rechten Rand keine Hintergrundfarbe mehr, (nur noch die Slider, für die ich sie eigens definiert habe).

Nun habe ich in die o. a. Kurzform des Programms noch ein Label eingeführt.
Zwischen Zeile 44 und 45 : Label label = new Label("irgendein Text");
Zwischen Zeile 99 und 100 : panel[0].add(label);

Ergebnis : Mit Panel hat das Label eine grüne Hintergrundfarbe, mit JPanel ist der Hintergrund grau.

Wenn ich nun anstatt Label "JLabel" schreibe, ist der Hintergrund immer noch grau. Offenbar passt swing mit swing doch nicht so gut zusammen...

Fazit Ich brauche also nur das awt-Panel und -Label als solches zu belassen.
 
S

SlaterB

Gast
in dem angegebenen Bug ist von einer System-Color die Rede,
mit eigenen normalen Farben gibts weder bei Swing noch bei AWT Probleme,

wenn du deine Rätsel-Erzählungen einstellst und ein normales Testprogramm postest,
kann dir jede Farbe der Welt eingebaut werden,

Fazits wie 'swing mit swing doch nicht so gut zusammen' sind da eher fehl am Platze..
 

Tobias

Top Contributor
Ähem, kanitrino, warum meinst du benutzen Millionen Java-Programmierer Swing seit Jahren? Weil es nicht so gut zusammenpasst und bei minimalen Ansprüchen in die Knie geht? Wenn in einem eigenen Programm etwas nicht funktioniert, sollte man den Fehler erst im eigenen Code suchen und erst nach sehr langer Zeit überhaupt auf die Idee kommen zu vermuten, dass eventuell in einer der benutzten Libraries ein Fehler sein könnte. Schließlich handelt es sich dabei meist um industriegeprüften, häufig eingesetzten und den Regeln der Software-Evolution (Was nicht funktioniert, wird nicht benutzt) unterworfenen Code.

mpG
Tobias
 

Kanitrino

Bekanntes Mitglied
SlaterB hat gesagt.:
wenn du deine Rätsel-Erzählungen einstellst und ein normales Testprogramm postest,
kann dir jede Farbe der Welt eingebaut werden,
Ich hoffe, die unten stehenden Testprogramme sind Dir nun nicht mehr rätselhaft.

Version 1 mit awt, also mit Panel und Label.
Man beachte : Der Hintergrund ist grün.

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

public class SwingTest1 extends JFrame
{
	Brett brett;
	FuchsGUI gui;
	Container container;

	public SwingTest1()
	{
		this.setSize(300, 250);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		brett		= new Brett();
		gui		= new FuchsGUI();

		container	= getContentPane();
		brett.setBackground(Color.green);
		container.setLayout(new BorderLayout());
		container.add("Center", brett);
		container.add("East", gui);
	}

	public static void main(String[] args)
	{
		SwingTest1 sw1 = new SwingTest1();
		sw1.setVisible(true);
	}
}

class FuchsGUI extends JPanel
{
	Panel[] panel = new Panel[5];
	Panel panelGesamt = new Panel();
	Label[] label = new Label[5];

	public FuchsGUI()
	{
		setPanel();
		setBackground(Color.green);
		setVisible(true);
		setBackground(Color.green);
	}

	public void setPanel()
	{
		panelGesamt.setLayout(new GridLayout(0,1));

		label[0] = new Label("Dieser Test soll eine");
		label[1] = new Label("GUI simulieren, um fest-");
		label[2] = new Label("zustellen, ob die Hinter-");
		label[3] = new Label("grundfarbe auch mit Swing");
		label[4] = new Label("gesetzt wird.");

		for(int i = 0; i<5; i++)
		{
			panel[i] = new Panel();
			panel[i].add(label[i]);
			panelGesamt.add(panel[i]);
		}
		add(panelGesamt);
	}
}

class Brett extends JPanel
{
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.pink);
		g.fillRect(20, 20, 100, 100);
	}
}
Nun Version 2 nur durch Einfügen einiger J's in Swing umgewandelt, also mit JPanel und JLabel.
Man beachte : Der Hintergrund hinter den Labels ist grau.

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

public class SwingTest2 extends JFrame
{
	Brett brett;
	FuchsGUI gui;
	Container container;

	public SwingTest2()
	{
		this.setSize(300, 250);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		brett		= new Brett();
		gui		= new FuchsGUI();

		container	= getContentPane();
		brett.setBackground(Color.green);
		container.setLayout(new BorderLayout());
		container.add("Center", brett);
		container.add("East", gui);
	}

	public static void main(String[] args)
	{
		SwingTest2 sw2 = new SwingTest2();
		sw2.setVisible(true);
	}
}

class FuchsGUI extends JPanel
{
	JPanel[] panel = new JPanel[5];
	JPanel panelGesamt = new JPanel();
	JLabel[] label = new JLabel[5];

	public FuchsGUI()
	{
		setPanel();
		setBackground(Color.green);
		setVisible(true);
		setBackground(Color.green);
	}

	public void setPanel()
	{
		panelGesamt.setLayout(new GridLayout(0,1));

		label[0] = new JLabel("Dieser Test soll eine");
		label[1] = new JLabel("GUI simulieren, um fest-");
		label[2] = new JLabel("zustellen, ob die Hinter-");
		label[3] = new JLabel("grundfarbe auch mit Swing");
		label[4] = new JLabel("gesetzt wird.");

		for(int i = 0; i<5; i++)
		{
			panel[i] = new JPanel();
			panel[i].add(label[i]);
			panelGesamt.add(panel[i]);
		}
		add(panelGesamt);
	}
}

class Brett extends JPanel
{
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		g.setColor(Color.pink);
		g.fillRect(20, 20, 100, 100);
	}
}
Es hilft auch nicht, eine Zeile einzufügen "panelGesamt.setBackground(Color.green);", sondern man muss jedes einzelne panel grün färben.
In diesem Test-Fall wäre das natürlich einfach, da es man das in der Schleife erledigen könnte, in der Praxis besteht aber naürlich nicht jedes (J)Panel nur aus einem (J)Label, sondern aus allerlei Komponenten.

Die Frage wäre also "Is it a bug or is it a feature ?", dass man in swing jedes JPanel einzeln einfärben muss, statt, wie im awt, über setBackground() den Hintergrnd einmal zu färben ?
 

Kanitrino

Bekanntes Mitglied
Har har ! Dann muss ich ja jedes panel einzeln UND panelGesamt durchsichtig machen. Das ist ja noch aufwändiger, als "nur" die panel's grün zu färben.

Offenbar scheint es also kein Bug zu sein sondern Absicht (auch wenn mir die Sinnhaftigkeit dieser "Verbesserung" verborgen bleibt).
 

Marco13

Top Contributor
Tja, das Leben ist hart :roll: bist du eigentlich schonmal auf die Idee gekommen, das ganze NUR mit AWT zu schreiben? Wie sieht es dann dann aus?

Egal, was du erreichst, wenn du so unbedarft AWT und Swing vermischst: Dafür sind die beiden nicht gedacht!. Und wenn dann irgendein Aspekt des (leicht "undeterministischen") Verhaltens, das durch die "verbotene" Mischung entsteht, zufällig das ist, was du gerade brauchst, dann ... ist es eben genau das: Zufall.

(Wenn man gerne einen Blauen Bildschirm mt weißem Text haben will, einfach Windows installieren, früher oder später bekommt man schon den Bluescreen :roll: )

Man kann zwar auch "global" die Hintergrundfarbe aller JPanels ändern, aber .... das wäre eine eher unschöne Lösung.
 
G

Gast2

Gast
schon schwer auf marco zu hören

Code:
public class SwingTest2 extends JFrame
{
   Brett brett;
   FuchsGUI gui;
   Container container;

   public SwingTest2()
   {
      this.setSize(300, 250);
      this.setDefaultCloseOperation(EXIT_ON_CLOSE);
      brett      = new Brett();
      gui      = new FuchsGUI();
      container   = getContentPane();
      container.setBackground(Color.green);
      container.setLayout(new BorderLayout());
      container.add("Center", brett);
      container.add("East", gui);
   }

   public static void main(String[] args)
   {
      SwingTest2 sw2 = new SwingTest2();
      sw2.setVisible(true);
   }
}

class FuchsGUI extends JPanel
{
   JPanel[] panel = new JPanel[5];
   JLabel[] label = new JLabel[5];

   public FuchsGUI()
   {
      setPanel();

   }

   public void setPanel()
   {
      setLayout(new GridLayout(0,1));
      label[0] = new JLabel("Dieser Test soll eine");
      label[1] = new JLabel("GUI simulieren, um fest-");
      label[2] = new JLabel("zustellen, ob die Hinter-");
      label[3] = new JLabel("grundfarbe auch mit Swing");
      label[4] = new JLabel("gesetzt wird.");

      for(int i = 0; i<5; i++)
      {
         JPanel p = new JPanel();
         p.setOpaque(false);
         p.add(label[i]);
         add(p);

      }
      setOpaque(false);
   }
}

class Brett extends JPanel
{
  public Brett()
  {
    setOpaque(false);
  }

   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      g.setColor(Color.pink);
      g.fillRect(20, 20, 100, 100);
   }
}

ich habe in deiner fuchsgui mal dein gesamtpanel rausgemacht weil es irgendwie keinen sinn ergab...
 

Kanitrino

Bekanntes Mitglied
SirWayne,

Danke, natürlich, die Klasse ist ja schon ein JPanel !

Auch interessant, dass man ein JPanel nur so lange braucht, bis es ge"add"et ist.
 
G

Gast2

Gast
???:L von was redest du??? ???:L

ist es jetzt grün oder nicht ??? kannst es ja beliebig anpassen wie du es brauchst....

nur solltest du vielleicht mal einsehen, dass deine fehler nichts mit SWING am hut haben...
 

Kanitrino

Bekanntes Mitglied
SirWayne hat gesagt.:
???:L von was redest du??? ???:L
Ich rede davon, dass Du meine Code
Code:
for(int i = 0; i<5; i++) 
      { 
         panel[i] = new Panel(); 
         panel[i].add(label[i]); 
         panelGesamt.add(panel[i]); 
      }
ersetzt hast durch
Code:
for(int i = 0; i<5; i++) 
      { 
         JPanel p = new JPanel(); 
         p.setOpaque(false); 
         p.add(label[i]); 
         add(p); 
      }
Das heißt, dass man offenbar kein JPanel[]-Array braucht, sondern nur ein einziges lokales JPanel, dass nach "add(p);" jeweils wieder überspeichert werden kann.

SirWayne hat gesagt.:
???:ist es jetzt grün oder nicht ??? ...
Ja, es ist grün, vielen Dank !

SirWayne hat gesagt.:
???:.., dass deine fehler nichts mit SWING am hut haben...
Nun ja, man darf nicht einfach Panel durch JPanel ersetzen. Als ich dies nämlich getan habe, war die Hintergundfarbe weg, und mir entschlüpfte fahrlässig der Begriff "Bug". In diesem Falle muss man eben noch zusätzliche Parameter hinzufügen, mit denen die JPanels durchsichtig gemacht werden. Das ist offenbar nicht ein Bug, sondern ein Feature.

Hier war übrigens die Verwendung des (letztlich überfüssigen) panelGesamt, in das ich die anderen JPanels eingepackt habe, durchaus lehrreich, denn die Hintergrundfarbe kam erst durch, nachdem ich ALLE übereinander liegenden JPanels durchsichtig gemacht habe, also so wie im richtigen Leben.
 
G

Gast2

Gast
Des war reiner Zufall dass es bei dir ging sobald du Swing und AWT mischt hast du eben komische Effekte...
Solltest dir mal in der FAQ den unterschied durchlesen...

Ich versteh auch nicht was du als BUG bzw. Feature empfindest ??? Es ist doch alles logisch...
Du hast 2 möglichkeiten entweder du machst den "unter/hintergrund" farbig und alles was du drauf legst durchsichtig.
oder du machst alles was du drüber legst farbig... aber wenn du viele panel hast ist es besser die durchsichtig zu machen und den hintergrund nur EINMAL zu färben anstatt alles was drüber legst immer wieder neu zu färben...

Des merkst du dann vielleicht mal wenn du Farbveläufe in einem Panel benutzt oder Hintergrundbilder...

ja das Panel ist immer noch ich habe 5 verschiedene Panel erzeugt warum solltest du die extra in einem array speichern wenn du damit danach nichts mehr machst... außerdem sind sie auf deinem hauptpanel mit add gespeichert und du kannst sie jederzeit wieder holen... Du könntest genau das gleiche mit den labels... warum extra ein array mit labels???
meistens sind labels nur zum anzeigen da und anonyme objekte weil man nichts weiter damit macht... wenn du bei irgendwelchen ereignissen was damit machen willst dann kannst sie färben...aber ansonsten fällt mir grad kein grund ein...
 

Kanitrino

Bekanntes Mitglied
SirWayne hat gesagt.:
Du könntest genau das gleiche mit den labels... warum extra ein array mit labels???
Nun ja, irgenwo müssen die Texte ja herkommen. Die Alternative zu einem Label-Array wäre doch wohl, sie aus einer Datei einzulesen.

In meinem speziellen Falle kann der Benutzer zwischen drei Sprachen wählen, woraufhin mein Label-Array über eine von drei Methoden besetzt wird.
 
G

Gast2

Gast
wenn du zwischen 3 Sprachen auswählen willst dann macht mein Bundle...

Code:
package favorite;

import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class Messages
{
  private static final String BUNDLE_NAME = "de.message"; 
  //private static final String BUNDLE_NAME = "en.message"; 
  //etc...

  private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);


  private Messages()
  {
  }


  public static String getString(String key)
  {
    try[code]
    {
return RESOURCE_BUNDLE.getString(key);
}
catch (MissingResourceException e)
{
return '!' + key + '!';
}
}
}

[/code]

dann hast du für jede Sprache ein eigens Bundle de.message
Code:
SwingTest2.label1=Dies ist ein Test
SwingTest2.label2=.....bla ...
SwingTest2.label3=...blubb
en.message
Code:
SwingTest2.label1=This is a test
SwingTest2.label2=.....bla ...
SwingTest2.label3=...blubb



unsere Methode und je nachdem welches bundle gesetzt ist bekommst du dann die sprache

Code:
   public void setPanel()
   {
      setLayout(new GridLayout(0,1));
      label[0] = new JLabel(Messages.getString("SwingTest2.label1"));
      label[1] = new JLabel(Messages.getString("SwingTest2.label2"));
      ...

      for(int i = 0; i<5; i++)
      {
         JPanel p = new JPanel();
         p.setOpaque(false);
         p.add(label[i]);
         add(p);

      }
      setOpaque(false);
   }

ich meinte nur du brauchst kein array da du ja nicht jedes mal deine labels in einer schleife addest...

z.B. kannst du auch einfach aufrufen

Code:
panel.add(new JLabel(Messages.getString("SwingTest2.label1"));

je nachdem was du mit dem Label vorhast solange es nur zum anziegen da ist reicht es vollkomen aus...[/quote]
 

Kanitrino

Bekanntes Mitglied
SirWayne,

Ich fürchte, ich muss mich wohl doch in Java I/O einarbeiten, darum habe ich mich bisher erfolgreich gedrückt.
Ich werde also etwas länger brauchen, Deinen Tipp umzusetzten.

Falls es Dich interessiert, wie meine bisherigen (dreisprachigen) Applets aussehen, kannst Du es Dir ja mal unter www.kanitrino.de ansehen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
D Interface Wieso Aufruf aller Methoden eines Interfaces? Java Basics - Anfänger-Themen 11
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
H Datentypen 64 Bit passt in 32 Bit, wieso? Java Basics - Anfänger-Themen 9
L Input/Output Wieso kommt diese Ausgabe? Java Basics - Anfänger-Themen 12
H Wieso wird mir ein Fehler angezeigt? Java Basics - Anfänger-Themen 5
H Wieso öffnet sich der Texteditor? Java Basics - Anfänger-Themen 6
ChrisPL4Y Wieso funktioniert dieses Programm nicht? Java Basics - Anfänger-Themen 6
B Wieso wird die Zeile "column" genannt und die Spalte "line"? Java Basics - Anfänger-Themen 12
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
B Wieso gibt er hier nur die ungeraden Zahlen aus? Java Basics - Anfänger-Themen 5
B Wieso gibt das Programm in der Console kein Ergebnis aus? Java Basics - Anfänger-Themen 2
A Wieso charAt(0) + charAt(3) = INT-Wert? Java Basics - Anfänger-Themen 5
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
P Cannot find symbol, wieso? Java Basics - Anfänger-Themen 5
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
T Wieso kann ich das jar file nicht starten? Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
A Wieso übergibt der nicht die bearbeitete txt file Java Basics - Anfänger-Themen 8
Z Lotto-Programm Wieso klappt das? Java Basics - Anfänger-Themen 8
P Compiler-Fehler wieso zeigt der compiler ein else without if? Java Basics - Anfänger-Themen 3
S OOP Die Methode funktioniert, aber wieso? Java Basics - Anfänger-Themen 2
X Connection reset, wieso? Java Basics - Anfänger-Themen 4
T Objektorientierte Programmierung - Kein Plan wieso das nicht funktioniert! Java Basics - Anfänger-Themen 6
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
A Wieso kann ich nicht auf diese Variable zugreifen? Java Basics - Anfänger-Themen 6
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
A Wieso denn das??? Java Basics - Anfänger-Themen 2
A Wieso erscheinen die Objekte manchmal und manchmal nicht Java Basics - Anfänger-Themen 2
A Erste Schritte Wieso funktioniert diese Klasse nicht Java Basics - Anfänger-Themen 11
R Wieso funktioniert dieses Array nicht? Java Basics - Anfänger-Themen 13
S Methoden void-Methode: Wieso gibt es eine Rückgabe? Java Basics - Anfänger-Themen 5
X Stack mit Oberklasse, wieso funktioniert es nicht? Java Basics - Anfänger-Themen 8
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
C Klassen Wieso kein infiniter Regress? Java Basics - Anfänger-Themen 4
M ArrayList - remove() löscht nicht! - weiß nicht wieso! Java Basics - Anfänger-Themen 8
X Wieso mehrere JRE ordner? Java Basics - Anfänger-Themen 8
J Regex Ausdrücke im Array - Wieso werden sie nicht erkannt? Java Basics - Anfänger-Themen 4
A Wieso wird immer 0 ausgegeben? Java Basics - Anfänger-Themen 4
R Wieso hat ein Konstruktor keinen Rückgabetyp? Java Basics - Anfänger-Themen 6
T JTable wird nicht erzeugt, wieso? Java Basics - Anfänger-Themen 17
S JTable removeRow() IndexOutOfBounceException - wieso? Java Basics - Anfänger-Themen 3
S wieso Fehlermeldung cannot find symbol hier Java Basics - Anfänger-Themen 10
N NumberFormatException, aber wieso? Java Basics - Anfänger-Themen 5
E Wieso funktioniert Boolean.parseBoolean(s) nicht? Java Basics - Anfänger-Themen 9
T Wieso kompiliert das? Java Basics - Anfänger-Themen 7
B Erste Schritte Programm kompiliert nicht. Wieso? Java Basics - Anfänger-Themen 14
Luk10 Wieso bricht die Rekursion nicht ab? Java Basics - Anfänger-Themen 3
B Warnung : Dead Code. Aber wieso? Java Basics - Anfänger-Themen 10
W Compiler-Fehler NullPointerException. Aber wieso? Java Basics - Anfänger-Themen 2
C Conways Game of Life / "Waldbrandsimulation": wieso temporäres Hilfs-Array?! Java Basics - Anfänger-Themen 8
R If-Abfrage liefert false zurück, wieso ? Java Basics - Anfänger-Themen 20
K Methode funzt nicht, wieso? Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
R wieso Nullpoint und was mit Events ? Java Basics - Anfänger-Themen 14
C Wieso funktioniert das Array nicht? Java Basics - Anfänger-Themen 10
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
M Wieso funktioniert dieser simple Code nicht? Java Basics - Anfänger-Themen 9
J Wert wird überschrieben, weiß nicht wieso Java Basics - Anfänger-Themen 2
S wieso ist mein Code falsch? Java Basics - Anfänger-Themen 2
D array.toString() wieso funktioniert es nicht Java Basics - Anfänger-Themen 4
A Wieso terminiert das Programm nicht? Java Basics - Anfänger-Themen 4
B Wieso ein Fehler? illegal Starts of expression? Java Basics - Anfänger-Themen 12
radiac Wieso bekomme ich kein Bild drauf??? Java Basics - Anfänger-Themen 13
Hatebreed Keine Datenbankverbindung, wieso? (ClassNotFoundEscpetion) Java Basics - Anfänger-Themen 18
U Anfänger Frage - Ausgabe funktioniert nicht - Wieso? Java Basics - Anfänger-Themen 10
G Wieso enum Declaration nur außerhalb einer Methode möglich? Java Basics - Anfänger-Themen 9
S Wieso funtkioniert das SQL DELETE nicht? Java Basics - Anfänger-Themen 1
fill0soph Wieso ist "Minus-Unendlich" == 1? Java Basics - Anfänger-Themen 4
G Wieso werdne die componentne nciht angezeigt Java Basics - Anfänger-Themen 4
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
F Wieso java.lang.StackOverflowError (minimales programm) Java Basics - Anfänger-Themen 11
G Wieso eine nullpointerexception? Java Basics - Anfänger-Themen 6
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
K Wieso kommt ne NullPointerException Java Basics - Anfänger-Themen 3
N Wieso final ? Java Basics - Anfänger-Themen 4
H wieso syntax error bei else ? Java Basics - Anfänger-Themen 3
H wieso fehler ? must return a type of int. Java Basics - Anfänger-Themen 4
F Wieso werden Char-Werte wie Zahlen addiert? Java Basics - Anfänger-Themen 5
M Wieso zeichnet es nicht auf den JPanel Java Basics - Anfänger-Themen 7
V Wieso NullPointerException Java Basics - Anfänger-Themen 7
M Wieso finden andere nicht die main .class Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben