Struktur eines Java Projektes mit übereinander liegenden Komponenten

Hallo Community,
Ich bin aktuell dabei ein kleines Spiel in Java zu programmieren.
Die verschiedenen Inhalte die angezeigt werden sollen, habe ich je in ein JPanel geaddet.
Nun will ich alle diese Inhalte wie ein Stapel übereinander legen,
sodass die höherliegenden “Folien” die unter ihnen liegenden verdecken. (bei einer Transparenz nur teilweise)
Damit will ich bewirken, dass wenn ich einen neuen Unterpunkt in meinem Spiel anzeigen lassen will
(zum Beispiel das ein Menu angezeigt wird) dieser nur einmal bei Start des Programms geladen
werden muss, anstatt jedes mal wenn ich diesen Unterpunkt aufrufe.

Ich muss also immer nur die “Folie” aus dem Stapel nach oben holen, die ich brauche und das Programm hat weniger Ladezeiten/Rechenarbeit.

Um dies umzusetzen, habe ich angefangen mit einem JLayeredPane.
In diese sind dann die einzelnen Panel wie: “Menu”, “Weltübersicht”, “Einstellungen” etc geaddet.

Jedoch habe ich jetzt das Problem, dass ich Komponenten anklicken kann, die gar nicht sichtbar sind (also unter dem aktuellen Panel das angezeigt wird liegen) oder z.B. Buttons die auch unter dem aktuellen Panel liegen sichtbar werden.

Ich habe eine vereinfachte Version von meine Programm geschrieben.
Hier könnte ihr das Programm sehen:

JavaCode
[spoiler]

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;


public class frame extends JFrame {

	private static final long serialVersionUID = 1L;
	private JLayeredPane contentPane;


	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					frame frame = new frame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	
	public frame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JLayeredPane();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		final JPanel OberesPanel = new JPanel();
		OberesPanel.setForeground(Color.BLACK);
		OberesPanel.setBackground(Color.GREEN);
		OberesPanel.setBounds(0,0,434,262);
		contentPane.add(OberesPanel);
		OberesPanel.setLayout(null);
		
		final JPanel UnteresPanel = new JPanel();
		UnteresPanel.setBackground(Color.YELLOW);
		UnteresPanel.setBounds(0,0,434,262);
		contentPane.add(UnteresPanel);
		UnteresPanel.setLayout(null);
		
		JButton btnOben = new JButton("Hier Klicken und 'UnteresPanel' sollte nach oben kommen");
		btnOben.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				contentPane.setLayer(OberesPanel, 1);
				contentPane.setLayer(UnteresPanel, 2);
				// Hier evtl. auch contentPane.moveToFront(UnteresPanel);
			}
		});
		btnOben.setBounds(10, 218, 390, 23);
		OberesPanel.add(btnOben);
		
		contentPane.setLayer(OberesPanel, 2);
		contentPane.setLayer(UnteresPanel, 1);
		
		final JButton btnUntenLinks = new JButton("Wurde noch nie geklickt");
		btnUntenLinks.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				btnUntenLinks.setText("Wurde schon mal geklickt");
			}
		});
		btnUntenLinks.setBounds(10, 11, 183, 138);
		UnteresPanel.add(btnUntenLinks);
		
		final JButton btnUntenRechts = new JButton("Wurde noch nie geklickt");
		btnUntenRechts.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				btnUntenRechts.setText("Wurde schon mal geklickt");
			}
		});
		btnUntenRechts.setBounds(231, 11, 183, 138);
		UnteresPanel.add(btnUntenRechts);
		contentPane.setLayer(UnteresPanel, 1);
	}
}

[/spoiler]

Habe ich ich hier den richtigen Ansatz? Wenn ja was mach ich falsch?
Oder sollte ich mein Programm anders strukturieren?

MFG HaveANiceDay

Du könntest das mit einem CardLayout machen. Die Panels liegen wie bei einem Kartenstapel übereinander und man kann sich ein gewünschtes Panel nach oben holen (anzeigen lassen). Aber das mit der Transparenz geht damit nicht, soweit ich weiss…

Evtl. solltest du statt echten Z-Indices mal die konstanten “DEFAULT_LAYER”, “PALETTE_LAYER” usw. der Klasse JLayeredPane verwenden. Bei mir hats damals sehr geholfen.

Erstmal danke für die Antworten!

Ich habe das gestern auch mal mit dem „DEFAULT_LAYER“, „PALETTE_LAYER“ versucht.
Und soweit ich das jetzt sehen kann funktioniert das auch.

Jedoch habe ich immer noch das Problem, dass die JPanel „maustransparent“ sind.
Ich kann also Objekte (wie ein Button) unter dem aktuellen Panel anklicken. :frowning:

Habt ihr da evtl eine Idee?

Meine Panels sind immer mindestens einen Layer über dem darunterliegendem (DEFAULT_LAYER → PALETTE_LAYER → MODAL_LAYER → POPUP_LAYER → DRAG_LAYER) und das Panel ist auf .setOpaque(true) eingestellt.

Evtl. noch die die darunter liegen, daran hindern, dass sie den Focus bekommen oder in den ActionListenern der Buttons noch 'ne Abfrage einbauen, ob überhaupt geklicked werden kann.

Gibt es eventuell eine Möglichkeit den Mausklick abzufangen, und sich die Position dieses zu merken.
Dann guckt man mit:

contentPane.getComponentAt(x, y);

welche Komponenten dort liegen.
Und guck in den dann welche die oberste ist.

EDIT: Ohh… die gibt ja nur eine Komponente zurück. Ist das immer die oberste?

Doch wie bekomme ich das hin, dass beim Mausklick nur meine Funktion ausgeführt wird?
Und nicht der eigentliche Klick?
Kann ich die Mausklick-Funktion irgendwie überschreiben?

EDIT: Wenn ich zum contentPane ein MouseListener hinzufüge, habe ich dann die Mausklick-Funktion überschrieben?
Und wie kann ich die Funktion aufrufen, die z.B. ein Button ausführt wenn ich in klicke? (aber für jeden Komponente)

[QUOTE=HaveANiceDay]Wenn ich zum contentPane ein MouseListener hinzufüge, habe ich dann die Mausklick-Funktion überschrieben?
Und wie kann ich die Funktion aufrufen, die z.B. ein Button ausführt wenn ich in klicke? (aber für jeden Komponente)[/I][/QUOTE]Also beim Button ists meistens ein ActionListener. Einen solchen kann man aber einer normalen Component nicht hinzufügen, da gehen nur MouseListener. Wenn du Glück hast, kannst du mit einem MouseListener auf die contentPane und der Methode “.consume()” verhindern, dass der ActionListener eines darunterliegenden Buttons ausgeführt wird. Aber welchen Sinn macht es überhaupt, einen Button unter einer “GlassPane” haben zu wollen, wenn man in eh’ nicht nutzen will?

Wieso sind das denn „GlassPane“?
Ich habe JPanels erstellt, die einen Background habe und so nicht durchsichtig sind. Nun kann man aber trotzdem die Objekte dahinter anklicken (also für den User gar nicht sichtbar sind).:frowning:


Ich habe mal ein MouseListener für contentPane geschrieben:

			@Override
			public void mouseClicked(MouseEvent e) {
				Point x = e.getPoint();
				try{
					Component akkComp = contentPane.getComponentAt(x);
					
					if (e.getModifiers() == InputEvent.BUTTON1_DOWN_MASK){
						akkComp.mouseDown(/** was muss hier hin?*/ , e.getX(), e.getY());
					}
					
					if (e.getModifiers() == InputEvent.BUTTON3_DOWN_MASK){
						akkComp.mouseDown(/** was muss hier hin?*/ , e.getX(), e.getY());
					}
				}
				catch (NullPointerException mouseClickEx) {
					
				}
			}
		});```

Habe aber das Problem, dass ich nicht weiß wie ich die .mouseDown() schreibe muss.

____________________________________________________________________________________________________________________________________________________________________________________

"<MouseEvent>.consume()"  - wo muss ich das hinschreiben?

**EDIT: 
Hier hin?
[..]
Point x = e.getPoint();
e.consume()
try{
[..]**

Also ist deine Intention, Schaltflächen auf dem Hintergrund zu bekommen? Dazu benötigst du nicht mal Buttons. Leg dir 'ne Map mit Rectangles an, die auf die Methoden zeigt, die dann ausgeführt werden sollen und prüfe in “mouseClicked()”-Methode des MouseListeners der ContentPane ob der Punkt in eines dieser Rectangles fällt.

  private final Map<Rectangle, MethodCall> buttons;

  ContentPane() {
    Map<Rectangle, MethodCall> btns = new HashMap<>();
    buttons.add(new Rectangle(b1x, b1y, b1w, b1h), new MethodCall() {
      public void invoke() {
        // Methode die bei Button1 ausgeführt werden soll
      }
    }
    // weitere Buttons
    this.buttons = Collections.unmodifiableMap(btns);
    addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent me) {
        for(Entry<Rectangle, MethodCall> entry : buttons.entrySet()) {
          if(entry.getKey().contains(me.getX(), me.getY()) {
            entry.getValue().invoke();
            break;
          }
        }
      }
    }
  }
}

interface MethodCall {
  public void invoke()
}```

Um mein Ziel zu verdeutlichen habe ich 2 Grafiken erstellt:

Hier kannst du sehen wie ich die Ansicht in Java haben will.
Die anklickbare Fläche, auf dem unteren Panel soll teilweise, vom über ihm liegenden Panel verdeckt sein.
Die verdeckte Fläche soll auch nicht anklickbar sein.

Bild 1
[spoiler]

[/spoiler]

Im Bild 2 habe ich dargestellt, man sich die Layer vorstellen kann.

Bild 2
[spoiler]

[/spoiler]

Ich hoffe du verstehst was ich meine.

Das Beispiel zu GlassPanes oben in http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html dürfte schon in die Richtung gehen, die du suchst - und dort ist auch beschrieben, wie man MouseEvents (abhängig von bestimmten Bedingungen) an die weiter unten liegenden Components „weiter-dispatcht“ (das sieht im ersten Moment etwas kompliziert aus, aber kann man recht einfach übernehmen und allgemein beschreiben).
Trotzdem sagt mir mein Bauchgefühl, dass hinter dem, was du bisher gesagt hast, noch eine Anforderung lauert, die bewirkt, dass das ganze „doch nicht so einfach“ ist … :wink:

Ein GlassPanel will ich ja grade nicht.

Ich will folgendes:

Die übereinander liegenden Bildschirminhalte
[spoiler][/spoiler]

Wie auf dem Bild zu sehen liegen alle Panels übereinander.
Je nach Hierarchie verdecken die Bilder sich gegenseitig (die Panels sind sozusagen massiv).
Also keine GlassPanels.
Ich habe nämlich folgendes Problem:
Wie auf dem Bild zu sehen, ist beim Start des Programms das Panel für den Login zu sehen.
Dafür habe ich ein Panel zum orangen Panel geaddet, welches in sich wiederum 1 Textfeld, ein Passwortfeld und ein Button hat.
Also soll das Programm bis man sich eingeloggt hat, nur diese drei Funktionen haben (Benutzernamen eingeben, Passwort eingeben, einloggen klicken).
Leider ist es so (und das ist meine Frage), das ich durch das orange Panel hindurch, auf zum Beispiel das blaue oder rote klicken kann.
So kann ich, bevor ich mich überhaupt eingeloggt habe, schon das Programm benutzen. :frowning:
Ich will es also irgendwie schaffen, dass das orange Panel die Mausklicks nicht bis zu den unteren Panels durchlässt.

In diesem Fall empfiejlt sich für das LoginPanel ein modaler Dialog. Das ist ein Extra Fenster, der das aufrufende Fenster solange deaktiviert, wie es geöffnet ist.

Jetzt ist die Verwirrung komplett :confused: Was soll eine Component, die man weder sehen noch anklicken kann?

Für das Login-Fenster den modalen Dialog und für das restliche Programm (wenn die Panels weder durchsichtig noch anklickbar sein sollen) das CardLayout (i already told). Dann hast du deine Panels wie in einem Kartenstapel übereinander und kannst immer eins davon anzeigen.

Ok ich erkläre nochmal wofür ich dieses System benutzen möchte.
Die übereinander liegenden Folien sind Bildschirme die anzeigt werden sollen.
Sowas wie:

  • Übersicht
  • Einstellungen
  • Ingame-Shop
  • Hilfe
  • etc.

Also sind in jedem Panel die Objekte gespeichert, die z.B. angezeigt werden sollen, wenn die Einstellung geöffnet sind.

Stellen wir uns vor, ich starte das Programm und es speichert alle Panels in den Speicher.
Also habe ich ganz oben den Login-Screen und darunter die anderen.
Das heißt, ich sehen nur den Login-Screen, die anderen Anzeigen sind aber schon geladen darunter.
Wenn ich mich einlogge soll zum Beispiel danach das blaue Panel angezeigt werden.
Also nehme ich das blaue Panel aus dem Stapel und lege es oben drauf.

So kann ich recht schnell zwischen den verschiedenen Anzeigen wechseln, ohne jedes mal alles neu zu laden.

Ich habe mir das CardLayout jetzt nochmal angesehen.
Es ist mit dem CardLayout nicht möglich das eine weiter oben im Kartenstapel liegende Komponente (die kleiner ist als die unter ihr) nur ein Teil der unter ihr liegenden Komponente verdeckt oder?

Im Bild soll also die große blaue Fläche hinter der Grünen liegen.
Die Grüne soll aber kleiner sein, und so soll ein Teil der blauen Fläche immer noch sichtbar sein.

Open

Im Endeffekt möchte ich ein Layout ähnlich dem von Windows.
Die verschiedenen Programme stellen die einzelnen Panels dar.
Das unterste Panel ist der Desktop.
Wenn ich den Explorer aufrufe, dann verdeckt er einen Teil des Desktops und ich kann dort keine Icons mehr anklicken (in meinem Programm ist das allerdings möglich - mein Problem).
In meinem Spiel werden die Windows Programme dann durch einzelne Panels ersetzt, wie z.B. Menü, Karte, Einstellungen, etc.
Im Gegensatz zu Windows soll es also ein Fenster bleiben und nicht mehrere verschiedene Fenster (daher gefällt mir der modale Dialog nicht).
Man könnte es auch mit dem Ebenenprinzip bei Photoshop vergleichen.

Also bei mir ist zwar die Verwirrung nicht komplett, aber ich denke mal, was du da vorhast geht mit Sicherheit auch anders besser, z.B. mit dem JDesktopPane. Ansonsten käme dafür ja nur noch ein NullLayout in Frage (aber das habe ich jetzt nicht gesagt ;)).

Das ist kein Argument. Ein paar Components irgendwo entfernen oder hinzufügen ist keine Sache von Millisekunden, sondern eher von Mikrosekunden.

LayeredPane, CardLayout, InternalFrames, … ich gehe davon aus, dass die bisher genannten Optionen alle Möglichkeiten bieten, die du brauchen könntest, und du dir „die Frage“ (sofern es denn eine gibt) selbst beantworten kannst.

Aber eher aus Neugier habe ich mal deinen Code aus dem Eröffnungsbeitrag ausprobiert, und kann jetzt zumindest einiges an Verwirrung verstehen. Wenn man über die Buttons fährt, erscheinen sie, obwohl sie auf einer anderen Layer liegen. Und ich dachte auch eine Weile „WTFITS?!“ :grr: . Long story short: Man MUSS schon direkt beim Hinzufügen der Components zur LayeredPane die Layer angeben (und zwar als Integer, und nicht als int!). Nachträglich nur „setLayer“ aufzurufen reicht nicht!
Wenn du also die Zeilen

            contentPane.add(OberesPanel, Integer.valueOf(2));
...
            contentPane.add(UnteresPanel, Integer.valueOf(1));

in dein ursprünglich gepostetes Programm einfügst, könnte das schon sein, was du suchst…

Ich hab mein Programm jetzt nochmal hochgeladen… (also das richtige/nicht vereinfachte)
Wenn man im Login-Screen ist kann man auf dem Hintergrund rum klicken (das blaue Bild) und das Menu, welches man eigentlich erst später sehen sollte aktivieren. :frowning:

Die GUI-Klasse:

GUI-Klasse
[spoiler]```import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.JDesktopPane;
import javax.swing.JLayeredPane;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import java.awt.event.InputMethodListener;
import java.awt.event.InputMethodEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JPasswordField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.FileNotFoundException;
import javax.swing.ImageIcon;

public class frame extends JFrame {

private static final long serialVersionUID = 1L;
private JLayeredPane contentPane;
private JTextField MoneyBar;
private JPanel MenuPanel;
private JTextField UsernameInput;
private JPasswordField PasswordInput;
private UserManagement UserManage;
private JDesktopPane LoginScreenPanel;
private JPanel LeisteUnten;
private JPanel AccountLoginPanel;
private management manage;

public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				frame frame = new frame();
				frame.setVisible(true);

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

public frame() {

	setIconImage(Toolkit.getDefaultToolkit().getImage(
			".//res//Connecticon.png"));

	contentPane = new JLayeredPane();
	JMenuBar menuBar = new JMenuBar();
	menuBar.setForeground(Color.WHITE);
	menuBar.setBackground(new Color(255, 255, 255));
	JMenu mnFile = new JMenu("File");
	JMenu mnHelp = new JMenu("Help");

	LeisteUnten = new JPanel();
	JTextPane TextPaneMoney = new JTextPane();
	TextPaneMoney.setEditable(false);
	TextPaneMoney.setBounds(850, 5, 40, 20);

	MoneyBar = new JTextField();
	MoneyBar.addInputMethodListener(new InputMethodListener() {
		public void inputMethodTextChanged(InputMethodEvent arg0) {

		}

		@Override
		public void caretPositionChanged(InputMethodEvent event) {

		}
	});
	MoneyBar.setBounds(900, 5, 90, 20);
	MoneyBar.setEditable(false);
	JMenuItem debugitem = new JMenuItem("debug");

	///setUndecorated(true);
	setTitle("Connecticon");
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setSize(1006, 579);
	setResizable(false);
	setVisible(true);
	setLocationRelativeTo(null);

	contentPane.setBackground(Color.WHITE);
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	contentPane.setOpaque(true);
	setContentPane(contentPane);
	contentPane.setLayout(null);

	JPanel Test = new JPanel();
	Test.setBackground(Color.ORANGE);
	Test.setBounds(0, 0, 1000, 500);
	contentPane.add(Test, Integer.valueOf(1));

	JPanel panel = new JPanel();
	panel.setBackground(Color.GREEN);
	panel.setVisible(true);
	panel.setBounds(0, 0, 1000, 500);
	contentPane.add(panel, Integer.valueOf(1));

	LeisteUnten.setBackground(new Color(128, 128, 128));
	LeisteUnten.setBounds(0, 500, 1000, 30);
	contentPane.add(LeisteUnten, Integer.valueOf(1));
	LeisteUnten.setLayout(null);

	TextPaneMoney.setBackground(SystemColor.activeCaption);
	TextPaneMoney.setText("Money");
	LeisteUnten.add(TextPaneMoney);

	MoneyBar.setHorizontalAlignment(SwingConstants.RIGHT);
	MoneyBar.setText("10.584");
	LeisteUnten.add(MoneyBar);
	MoneyBar.setColumns(10);

	JButton MenuButton = new JButton("Menu");
	MenuButton.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			onTop2(MenuPanel, LeisteUnten);
		}
	});
	MenuButton.setBounds(10, 5, 100, 20);
	LeisteUnten.add(MenuButton);

	MenuPanel = new JPanel();
	MenuPanel.setBackground(SystemColor.control);
	MenuPanel.setBounds(0, 0, 1000, 500);
	MenuPanel.setLayout(null);
	contentPane.add(MenuPanel, Integer.valueOf(1));

	JTextArea DebugMonitor = new JTextArea();
	DebugMonitor.setBounds(1000, 0, 220, 530);
	contentPane.add(DebugMonitor);

	DebugMonitor.setText("erste Zeile 

zweite Zeile");
DebugMonitor.setBackground(Color.LIGHT_GRAY);
DebugMonitor.setFont(new Font(„Century Gothic“, Font.PLAIN, 13));
DebugMonitor.setEditable(false);

	contentPane.setLayer(LeisteUnten, 1);

	setJMenuBar(menuBar);
	menuBar.add(mnFile);
	menuBar.add(mnHelp);
	mnHelp.add(debugitem);
	debugitem.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent pressed) {
			if (getWidth() == 1000) {
				setSize(1226, 629);
			} else {
				setSize(1006, 629);
			}
		}
	});

	createloginScreen();

	setupMenu("Management", panel, "/images/menuicons/management.png");
	setupMenu("Vehicles", Test, "/images/menuicons/vihicles.png");
	setupMenu("Map", panel, "/images/menuicons/map.png");
	setupMenu("Locations", panel, "/images/menuicons/locations.png");
	setupMenu("Deals", panel, "/images/menuicons/deals.png");
	setupMenu("Financials", panel, "/images/menuicons/financials.png");
	setupMenu("xxx", panel, "/images/menuicons/xxx.png");
	setupMenu("Shop", panel, "/images/menuicons/shop");
	setupMenu("Statistics", panel, "/images/menuicons/stats.png");
	setupMenu("Settings", panel, "/images/menuicons/settings");
}

private void setupMenu(String Text, final JPanel PointingAt,
		String ImagePath) {
	int y = (int) 52.5;
	int x = 0;
	try {
		x = MenuPanel.getComponentCount();
	} catch (NullPointerException npe) {
		// nothing
	}

	while (x > 4) {
		x = x - 5;
		y = (int) (y + 227.5);
	}

	JPanel MenuItem = new JPanel();
	MenuItem.setBounds((50 + 200 * x), y, 100, 150);
	MenuItem.setLayout(null);
	MenuItem.setBackground(MenuPanel.getBackground());

	MenuPanel.add(MenuItem, Integer.valueOf(2));

	final MenuItems MenuImage = new MenuItems(PointingAt);
	MenuImage.addMouseListener(new MouseAdapter() {
		@Override
		public void mousePressed(MouseEvent e) {
			onTop(PointingAt);
		}
	});
	MenuImage.setBounds(0, 0, 100, 100);
	try {
		MenuImage.setIcon(new ImageIcon(getClass().getResource(ImagePath)));
	} catch (NullPointerException e) {
		MenuImage.setIcon(new ImageIcon(getClass().getResource(
				"/images/menuicons/Placeholder.png")));
	}

	MenuItem.add(MenuImage);

	JLabel MenuItemLabel = new JLabel(Text);
	MenuItemLabel.setHorizontalAlignment(SwingConstants.CENTER);
	MenuItemLabel.setBounds(0, 110, 100, 15);
	MenuItem.add(MenuItemLabel);

}

private void createloginScreen() {

	UserManage = new UserManagement();
	final JButton LoginBtn = new JButton("Log in");
	LoginScreenPanel = new JDesktopPane();
	LoginScreenPanel.setBounds(0, 0, 1000, 530);
	LoginScreenPanel.setLayout(null);
	LoginScreenPanel.setBackground(SystemColor.controlHighlight);
	LoginScreenPanel.setVisible(true);
	LoginScreenPanel.setOpaque(true);

	contentPane.add(LoginScreenPanel, Integer.valueOf(1));
	contentPane.setLayer(LoginScreenPanel, 10);
	contentPane.moveToFront(LoginScreenPanel);

	AccountLoginPanel = new JPanel();
	AccountLoginPanel.setBounds(180, 280, 300, 200);
	AccountLoginPanel.setLayout(null);
	AccountLoginPanel.setBackground(new Color(255, 255, 255, 50));
	AccountLoginPanel.setBorder(new LineBorder(
			new Color(255, 255, 255, 80), 2));
	LoginScreenPanel.add(AccountLoginPanel);

	JLabel wallpaper = new JLabel();
	wallpaper.setIcon(new ImageIcon(getClass().getResource(
			"/images/wallpaper.png")));
	wallpaper.setBounds(0, 0, 1000, 530);
	LoginScreenPanel.add(wallpaper);

	UsernameInput = new JTextField();
	UsernameInput.addKeyListener(new KeyAdapter() {
		/**
		 * kann bei vielen Benutzern zu starken laggs führen
		 * 
		 * @Override public void keyReleased(KeyEvent e) { if
		 *           (UserManage.isUsername(UsernameInput.getText())) {
		 *           LoginBtn.setText("Log in"); } else {
		 *           LoginBtn.setText("Sign up"); } }
		 */
		@Override
		public void keyPressed(KeyEvent enterpressed) {
			int key = enterpressed.getKeyCode();
			if (key == KeyEvent.VK_ENTER) {
				login();
			}
		}
	});

	UsernameInput.setHorizontalAlignment(SwingConstants.LEFT);
	UsernameInput.setBounds(50, 54, 200, 25);
	AccountLoginPanel.add(UsernameInput);
	UsernameInput.setColumns(10);

	PasswordInput = new JPasswordField();
	PasswordInput.setHorizontalAlignment(SwingConstants.LEFT);
	PasswordInput.setBounds(50, 104, 200, 25);
	PasswordInput.addKeyListener(new KeyAdapter() {
		@Override
		public void keyPressed(KeyEvent enterpressed) {
			int key = enterpressed.getKeyCode();
			if (key == KeyEvent.VK_ENTER) {
				login();
			}
		}
	});
	AccountLoginPanel.add(PasswordInput);

	UserManage = new UserManagement();

	LoginBtn.setFont(new Font("Tahoma", Font.BOLD, 11));
	LoginBtn.setForeground(Color.BLACK);
	LoginBtn.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			login();
		}
	});
	LoginBtn.setBounds(170, 137, 80, 25);
	AccountLoginPanel.add(LoginBtn);

	JLabel lblUsername = new JLabel("Username");
	lblUsername.setBounds(52, 39, 198, 14);
	AccountLoginPanel.add(lblUsername);

	JLabel lblPassword = new JLabel("Password");
	lblPassword.setBounds(52, 90, 198, 14);
	AccountLoginPanel.add(lblPassword);

	onTop(AccountLoginPanel);
}

private void createNewUserPanel(String Username) {
	JPanel NewUserPanel = new JPanel();
	NewUserPanel.setBounds(0, 0, 1000, 530);
	NewUserPanel.setBackground(new Color(255, 255, 255, 50));
	contentPane.add(NewUserPanel);
	contentPane.setLayer(NewUserPanel, JLayeredPane.MODAL_LAYER);
}

private void login() {

	String Password = "";
	for (char x : PasswordInput.getPassword()) {
		Password = Password + x;
	}

	if (UserManage.isUsername(UsernameInput.getText())) {

		if (UserManage.isUser(UsernameInput.getText(), Password)) {

			onTop2(MenuPanel, LeisteUnten);

			contentPane.setLayer(AccountLoginPanel,
					JLayeredPane.DEFAULT_LAYER);

		} else {
			JOptionPane.showMessageDialog(null,
					"Username or password doesnt fit !", "Error Message",
					JOptionPane.PLAIN_MESSAGE);
		}

	} else {
		createNewUserPanel(UsernameInput.getText());
	}

}

private void onTop(Component onTopC) {

	for (Component x : contentPane.getComponents()) {
		contentPane.setLayer(x, JLayeredPane.DEFAULT_LAYER);
	}

	contentPane.setLayer(onTopC, JLayeredPane.PALETTE_LAYER);
}

/**
 * Funktioniert nicht o.O
 * 
 * private void onTopmultiple(JPanel onTopCList) { for (Component x :
 * contentPane.getComponents()) { contentPane.setLayer(x,
 * JLayeredPane.DEFAULT_LAYER); }
 * 
 * for (Component z : onTopCList.getComponents()) { contentPane.setLayer(z,
 * JLayeredPane.PALETTE_LAYER); } }
 */

private void onTop2(Component onTopC, Component onTopC2) {

	for (Component x : contentPane.getComponents()) {
		contentPane.setLayer(x, JLayeredPane.DEFAULT_LAYER);
	}

	contentPane.setLayer(onTopC, JLayeredPane.PALETTE_LAYER);
	contentPane.setLayer(onTopC2, JLayeredPane.PALETTE_LAYER);
}

public void DisplayMoney(int money) {
	MoneyBar.setText(money + "");

	if (money == 0) {
		MoneyBar.setForeground(Color.BLACK);
	}
	if (money > 0) {
		MoneyBar.setForeground(Color.GREEN);
	}
	if (money < 0) {
		MoneyBar.setForeground(Color.RED);
	}
}

public void createShop() {

}

}



Downloads
[RunableJar](http://www.file-upload.net/download-7992319/HaveANiceDay-s-Programm.jar.html)
[EclipseOrdner](http://www.file-upload.net/download-7992419/HaveANiceDaysProgrammEclipseOrdner.rar.html)

Ungetestet: contentPane.add… wird fast IMMER mit Integer.valueOf(1) aufgerufen, die sollten wohl unterschiedlich sein. Einmal wird es auch wieder OHNE Integer-Argument aufgerufen, und dann nochmal mit welchen, von denen ich auch nicht auswendig weiß, welchen Wert sie haben. Wenn’s nicht hilft, muss man das Projekt halt doch mal importieren… :rolleyes: