# Button soll verschiedene panel zufällig durchschalten



## SciMan (3. Jan 2013)

Hi und ein Frohes neues Jahr euch allen,
muss als Studienprojekt ein JavaGame basteln, allerdings reicht mein Wissen was Java betrifft einfach nicht aus und ich finde einfach keine Lösung.
Kurze erklärung zum Game, beim Klick auf start sollen 5 verschiedene Panel zufällig nacheinander angezeigt werden.
Jedes bis auf 1 Panel 2x.....das Panel, welches nur 1 x vorkam muss vom Spieler dann angeklickt werden.
Wir haben die komplette GUI mit WindowBuilder erstellt und nun hänge ich eben am Startbutton, ich bekomme es einfach nicht hin, dass die Panel angezeigt werden.

Hier mal der Code, die wichtigen Stellen sind Fett/Kursiv


```
package Main;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Toolkit;
import java.awt.CardLayout;
import java.awt.Color;
import javax.swing.JLayeredPane;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import java.awt.Font;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingConstants;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.DropMode;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.JTextField;

public class theGame extends JFrame {
	private JTextField restZeit;
	private JTextField textField_1;

	/**
	 * Launch the application.
	 */
	public boolean start = false;
	
	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Throwable e) {
			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					theGame frame = new theGame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public theGame() {
		
		setTitle("Schere-Stein-Papier-Echse-Spock v1.0");
		setResizable(false);
		setIconImage(Toolkit.getDefaultToolkit().getImage(theGame.class.getResource("/Icons/Schere-Stein-Papier-Eidechse-Spock.png")));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 800, 700);
		
		//Cardlayout Ebenen
		
		final JPanel Home = new JPanel();
		Home.setBackground(Color.BLACK);
		
		final JPanel Anleitung = new JPanel();
		Anleitung.setBackground(Color.BLACK);
		
		final JPanel Ende = new JPanel();
		Ende.setBackground(new Color(255, 255, 255));
		
		final JPanel Game = new JPanel();
		Game.setBackground(new Color(0, 0, 0));
		
		JButton btnStart = new JButton("SPIEL STARTEN");
		btnStart.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Home.setVisible(false);
				Anleitung.setVisible(false);
				Game.setVisible(true);
			}
		});
		btnStart.setToolTipText("");
		btnStart.setHorizontalAlignment(SwingConstants.LEFT);
		btnStart.setFont(new Font("Impact", Font.PLAIN, 22));
		btnStart.setIcon(new ImageIcon(theGame.class.getResource("/Icons/inward-black-logoff.png")));
		btnStart.setBackground(new Color(65, 105, 225));
		btnStart.setForeground(new Color(0, 0, 0));
		
		JButton btnAnleitung = new JButton("ANLEITUNG");
		btnAnleitung.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Home.setVisible(false);
				Anleitung.setVisible(true);
			}
		});
		btnAnleitung.setHorizontalAlignment(SwingConstants.LEFT);
		btnAnleitung.setIcon(new ImageIcon(theGame.class.getResource("/Icons/inward-black-info.png")));
		btnAnleitung.setForeground(Color.BLACK);
		btnAnleitung.setFont(new Font("Impact", Font.PLAIN, 22));
		btnAnleitung.setBackground(new Color(65, 105, 225));
		
		JLabel logo = new JLabel("New label");
		logo.setIcon(new ImageIcon(theGame.class.getResource("/Icons/Schere-Stein-Papier-Eidechse-Spock.png")));
		
		JLabel lblScheresteinpapier = new JLabel("SCHERE-STEIN-PAPIER");
		lblScheresteinpapier.setFont(new Font("Impact", Font.PLAIN, 40));
		lblScheresteinpapier.setForeground(new Color(255, 255, 255));
		
		JLabel lblEchsespock = new JLabel("ECHSE-SPOCK");
		lblEchsespock.setFont(new Font("Impact", Font.PLAIN, 40));
		lblEchsespock.setForeground(new Color(255, 255, 255));
		
		JLabel lblTheGame = new JLabel("The game");
		lblTheGame.setFont(new Font("Impact", Font.BOLD, 60));
		lblTheGame.setForeground(new Color(255, 255, 255));
		GroupLayout gl_Home = new GroupLayout(Home);
		gl_Home.setHorizontalGroup(
			gl_Home.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_Home.createSequentialGroup()
					.addGap(301)
					.addComponent(logo, GroupLayout.PREFERRED_SIZE, 192, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(301, Short.MAX_VALUE))
				.addGroup(gl_Home.createSequentialGroup()
					.addGap(270)
					.addGroup(gl_Home.createParallelGroup(Alignment.TRAILING)
						.addComponent(btnStart, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 255, Short.MAX_VALUE)
						.addComponent(btnAnleitung, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 255, Short.MAX_VALUE))
					.addGap(269))
				.addGroup(gl_Home.createSequentialGroup()
					.addGap(266)
					.addComponent(lblTheGame)
					.addContainerGap(265, Short.MAX_VALUE))
				.addGroup(gl_Home.createSequentialGroup()
					.addGap(224)
					.addComponent(lblScheresteinpapier)
					.addContainerGap(224, Short.MAX_VALUE))
				.addGroup(gl_Home.createSequentialGroup()
					.addGap(289)
					.addComponent(lblEchsespock)
					.addContainerGap(288, Short.MAX_VALUE))
		);
		gl_Home.setVerticalGroup(
			gl_Home.createParallelGroup(Alignment.TRAILING)
				.addGroup(gl_Home.createSequentialGroup()
					.addGap(22)
					.addComponent(lblScheresteinpapier)
					.addGap(11)
					.addComponent(lblEchsespock)
					.addGap(18)
					.addComponent(lblTheGame)
					.addPreferredGap(ComponentPlacement.RELATED, 29, Short.MAX_VALUE)
					.addComponent(logo)
					.addGap(18)
					.addComponent(btnStart)
					.addGap(18)
					.addComponent(btnAnleitung, GroupLayout.PREFERRED_SIZE, 73, GroupLayout.PREFERRED_SIZE)
					.addGap(49))
		);
		Home.setLayout(gl_Home);
		
		
		
		
		
		getContentPane().setLayout(new CardLayout(0, 0));
		getContentPane().add(Home, "name_38422498199445");
		getContentPane().add(Anleitung, "name_38422509554768");
		getContentPane().add(Game, "name_38422520771154");
		
		JButton btnStein = new JButton("");
		btnStein.setBackground(new Color(0, 0, 0));
		btnStein.setIcon(new ImageIcon(theGame.class.getResource("/Icons/steine_2.JPG")));
		
		JButton btnEchse = new JButton("");
		btnEchse.setBackground(new Color(0, 0, 0));
		btnEchse.setIcon(new ImageIcon(theGame.class.getResource("/Icons/eidechse_9.JPG")));
		
		JButton btnSpock = new JButton("");
		btnSpock.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Game.setVisible(false);
				Ende.setVisible(true);
			}
		});
		btnSpock.setBackground(new Color(0, 0, 0));
		btnSpock.setIcon(new ImageIcon(theGame.class.getResource("/Icons/star_trek_sticker_spock__24443.jpg")));
		
		JButton btnSchere = new JButton("");
		btnSchere.setBackground(new Color(0, 0, 0));
		btnSchere.setIcon(new ImageIcon(theGame.class.getResource("/Icons/schere_6.JPG")));
		
		JButton btnNewButton = new JButton("");
		btnNewButton.setBackground(new Color(0, 0, 0));
		btnNewButton.setIcon(new ImageIcon(theGame.class.getResource("/Icons/blatt-papier-t10263.jpg")));
		
		JPanel panelAnzeige = new JPanel();
		panelAnzeige.setBackground(new Color(0, 0, 0));
		
		restZeit = new JTextField();
		restZeit.setHorizontalAlignment(SwingConstants.CENTER);
		restZeit.setForeground(new Color(255, 255, 255));
		restZeit.setBackground(new Color(0, 0, 0));
		restZeit.setEditable(false);
		restZeit.setColumns(10);
		
		JLabel lblGewonneneRunden = new JLabel("GEWONNENE RUNDEN");
		lblGewonneneRunden.setFont(new Font("Impact", Font.PLAIN, 22));
		lblGewonneneRunden.setForeground(new Color(255, 255, 255));
		
		textField_1 = new JTextField();
		textField_1.setHorizontalAlignment(SwingConstants.RIGHT);
		textField_1.setForeground(new Color(255, 255, 255));
		textField_1.setBackground(new Color(0, 0, 0));
		textField_1.setColumns(10);
		
		JLabel lblVerbleibendeZeit = new JLabel("VERBLEIBENDE ZEIT");
		lblVerbleibendeZeit.setFont(new Font("Impact", Font.PLAIN, 22));
		lblVerbleibendeZeit.setForeground(new Color(255, 255, 255));
		
		JLabel lblLetsGetReady = new JLabel("LET'S GET READY TO RUMBLE...");
		lblLetsGetReady.setFont(new Font("Impact", Font.PLAIN, 30));
		lblLetsGetReady.setForeground(new Color(255, 255, 255));
		GroupLayout gl_Game = new GroupLayout(Game);
		gl_Game.setHorizontalGroup(
			gl_Game.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_Game.createSequentialGroup()
					.addGap(128)
					.addComponent(panelAnzeige, GroupLayout.PREFERRED_SIZE, 539, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(127, Short.MAX_VALUE))
				.addGroup(gl_Game.createSequentialGroup()
					.addGap(354)
					.addComponent(restZeit, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(354, Short.MAX_VALUE))
				.addGroup(gl_Game.createSequentialGroup()
					.addContainerGap(698, Short.MAX_VALUE)
					.addComponent(textField_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addContainerGap())
				.addGroup(gl_Game.createSequentialGroup()
					.addGap(318)
					.addComponent(lblVerbleibendeZeit)
					.addContainerGap(317, Short.MAX_VALUE))
				.addGroup(gl_Game.createSequentialGroup()
					.addGap(15)
					.addGroup(gl_Game.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_Game.createSequentialGroup()
							.addComponent(lblLetsGetReady)
							.addPreferredGap(ComponentPlacement.RELATED, 290, Short.MAX_VALUE)
							.addComponent(lblGewonneneRunden)
							.addContainerGap())
						.addGroup(gl_Game.createSequentialGroup()
							.addComponent(btnSchere)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(btnStein, GroupLayout.PREFERRED_SIZE, 145, GroupLayout.PREFERRED_SIZE)
							.addGap(10)
							.addComponent(btnNewButton, GroupLayout.PREFERRED_SIZE, 149, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(btnEchse, GroupLayout.PREFERRED_SIZE, 151, Short.MAX_VALUE)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(btnSpock)
							.addGap(14))))
		);
		gl_Game.setVerticalGroup(
			gl_Game.createParallelGroup(Alignment.TRAILING)
				.addGroup(Alignment.LEADING, gl_Game.createSequentialGroup()
					.addGroup(gl_Game.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_Game.createSequentialGroup()
							.addGap(81)
							.addComponent(lblGewonneneRunden)
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(textField_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_Game.createSequentialGroup()
							.addGap(56)
							.addComponent(lblLetsGetReady)))
					.addGap(42)
					.addComponent(panelAnzeige, GroupLayout.PREFERRED_SIZE, 175, GroupLayout.PREFERRED_SIZE)
					.addGap(85)
					.addComponent(lblVerbleibendeZeit)
					.addGap(11)
					.addComponent(restZeit, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addGap(18)
					.addGroup(gl_Game.createParallelGroup(Alignment.LEADING)
						.addComponent(btnSchere, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
						.addComponent(btnStein, Alignment.TRAILING)
						.addComponent(btnNewButton, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 137, Short.MAX_VALUE)
						.addComponent(btnEchse, Alignment.TRAILING, GroupLayout.PREFERRED_SIZE, 137, GroupLayout.PREFERRED_SIZE)
						.addComponent(btnSpock, Alignment.TRAILING))
					.addGap(24))
		);
		panelAnzeige.setLayout(new CardLayout(0, 0));
		
		
		[B][I]String[] randomZahl={"0","0","1","1","2","2","3","3","4","4"};
		Randomizer rnd = new Randomizer();
		//System.out.println(rnd.random());
		JLabel lblEchse = new JLabel("ECHSE");
		lblEchse.setHorizontalAlignment(SwingConstants.CENTER);
		lblEchse.setFont(new Font("Impact", Font.PLAIN, 80));
		lblEchse.setForeground(new Color(255, 255, 255));
		//panelAnzeige.add(lblEchse, "name_45662879437764");
	
		JLabel lblPapier = new JLabel("PAPIER");
		lblPapier.setFont(new Font("Impact", Font.PLAIN, 80));
		lblPapier.setForeground(new Color(255, 255, 255));
		lblPapier.setHorizontalAlignment(SwingConstants.CENTER);
		//panelAnzeige.add(lblPapier, "name_45592279956646");
		
		JLabel lblStein = new JLabel("STEIN");
		lblStein.setHorizontalAlignment(SwingConstants.CENTER);
		lblStein.setFont(new Font("Impact", Font.PLAIN, 80));
		lblStein.setForeground(new Color(255, 255, 255));
		//panelAnzeige.add(lblStein, "name_45514248576573");
		
		JLabel lblSchere = new JLabel("SCHERE");
		lblSchere.setBackground(new Color(0, 0, 0));
		lblSchere.setForeground(new Color(255, 255, 255));
		lblSchere.setFont(new Font("Impact", Font.PLAIN, 80));
		lblSchere.setHorizontalAlignment(SwingConstants.CENTER);
		//panelAnzeige.add(lblSchere, "name_45243146397439");
		
		JLabel lblSpock = new JLabel("SPOCK");
		lblSpock.setFont(new Font("Impact", Font.PLAIN, 80));
		lblSpock.setForeground(new Color(255, 255, 255));
		lblSpock.setHorizontalAlignment(SwingConstants.CENTER);
		//panelAnzeige.add(lblSpock, "name_45709799146917");
		
		/*if(rnd.random() == "0"){
			panelAnzeige.add(lblEchse, "name_45662879437764");
		}
		else if (rnd.random() == "1"){
			panelAnzeige.add(lblPapier, "name_45592279956646");	
		}
		else if (rnd.random() == "2"){
			panelAnzeige.add(lblStein, "name_45514248576573");
		}
		else if (rnd.random() == "3"){
			panelAnzeige.add(lblSchere, "name_45243146397439");
		}
		else if (rnd.random() == "4"){
			panelAnzeige.add(lblSpock, "name_45709799146917");
		}
		*/
		rnd.random(randomZahl);
		/*
		if(start == true) {
		
		for(int x=0;x<9;x++){
			switch(randomZahl[x]){
			
			case "0":
				panelAnzeige.add(lblSchere, "name_45243146397439");
				continue;
			
			case "1":
				panelAnzeige.add(lblStein, "name_45514248576573");
				continue;
				
			case "2":
				panelAnzeige.add(lblPapier, "name_45592279956646");
				continue;
				
			case "3":
				panelAnzeige.add(lblEchse, "name_45662879437764");
				continue;
				
			case "4":
				panelAnzeige.add(lblSpock, "name_45709799146917");
				continue;
				
					
			}
		}
		}
		*/[/I][/B]
		Game.setLayout(gl_Game);
		getContentPane().add(Ende, "name_38434235034777");
		
		
		
		JLabel gameover = new JLabel("GAME OVER");
		gameover.setFont(new Font("Impact", Font.PLAIN, 80));
		gameover.setForeground(new Color(128, 0, 0));
		gameover.setHorizontalAlignment(SwingConstants.CENTER);
		
		JLabel picEnde = new JLabel("");
		picEnde.setIcon(new ImageIcon(theGame.class.getResource("/Icons/951955_Crimen_620.jpg")));
		
		JButton btnNeustart = new JButton("NEUSTART");
		btnNeustart.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Ende.setVisible(false);
				Home.setVisible(true);
			}
		});
		btnNeustart.setFont(new Font("Impact", Font.PLAIN, 22));
		btnNeustart.setBackground(new Color(128, 0, 0));
		btnNeustart.setForeground(new Color(255, 255, 255));
		GroupLayout gl_Ende = new GroupLayout(Ende);
		gl_Ende.setHorizontalGroup(
			gl_Ende.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_Ende.createSequentialGroup()
					.addGroup(gl_Ende.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_Ende.createSequentialGroup()
							.addGap(87)
							.addComponent(picEnde))
						.addGroup(gl_Ende.createSequentialGroup()
							.addGap(222)
							.addComponent(gameover))
						.addGroup(gl_Ende.createSequentialGroup()
							.addGap(337)
							.addComponent(btnNeustart)))
					.addContainerGap(87, Short.MAX_VALUE))
		);
		gl_Ende.setVerticalGroup(
			gl_Ende.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_Ende.createSequentialGroup()
					.addGap(27)
					.addComponent(picEnde)
					.addPreferredGap(ComponentPlacement.RELATED, 31, Short.MAX_VALUE)
					.addComponent(gameover)
					.addGap(16)
					.addComponent(btnNeustart)
					.addContainerGap())
		);
		Ende.setLayout(gl_Ende);
		
	// Startbutton
		
		[B][I]JButton btn2Start = new JButton("SPIEL STARTEN");
		btn2Start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				start = true;
				Home.setVisible(false);
				Anleitung.setVisible(false);
				Game.setVisible(true);
			}
		});
		System.out.println(start);
		
		if(start == true) {
			
			for(int x=0;x<9;x++){
				switch(randomZahl[x]){
				
				case "0":
					panelAnzeige.add(lblSchere, "name_45243146397439");
					continue;
				
				case "1":
					panelAnzeige.add(lblStein, "name_45514248576573");
					continue;
					
				case "2":
					panelAnzeige.add(lblPapier, "name_45592279956646");
					continue;
					
				case "3":
					panelAnzeige.add(lblEchse, "name_45662879437764");
					continue;
					
				case "4":
					panelAnzeige.add(lblSpock, "name_45709799146917");
					continue;
					
						
				}
			}
			}[/I][/B]
		
		
		
		btn2Start.setIcon(new ImageIcon(theGame.class.getResource("/Icons/inward-black-logoff.png")));
		btn2Start.setToolTipText("");
		btn2Start.setHorizontalAlignment(SwingConstants.LEFT);
		btn2Start.setForeground(Color.BLACK);
		btn2Start.setFont(new Font("Impact", Font.PLAIN, 22));
		btn2Start.setBackground(new Color(65, 105, 225));
		
		JScrollPane scrollPane = new JScrollPane();
		
		JLabel lblAnleitung = new JLabel("ANLEITUNG");
		lblAnleitung.setFont(new Font("Impact", Font.PLAIN, 60));
		lblAnleitung.setForeground(new Color(255, 255, 255));
		lblAnleitung.setBackground(new Color(0, 0, 0));
		GroupLayout gl_Anleitung = new GroupLayout(Anleitung);
		gl_Anleitung.setHorizontalGroup(
			gl_Anleitung.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_Anleitung.createSequentialGroup()
					.addGroup(gl_Anleitung.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_Anleitung.createSequentialGroup()
							.addGap(271)
							.addComponent(lblAnleitung))
						.addGroup(gl_Anleitung.createSequentialGroup()
							.addGap(111)
							.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 572, GroupLayout.PREFERRED_SIZE))
						.addGroup(gl_Anleitung.createSequentialGroup()
							.addGap(274)
							.addComponent(btn2Start, GroupLayout.PREFERRED_SIZE, 246, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap(111, Short.MAX_VALUE))
		);
		gl_Anleitung.setVerticalGroup(
			gl_Anleitung.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_Anleitung.createSequentialGroup()
					.addGap(30)
					.addComponent(lblAnleitung)
					.addGap(18)
					.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 421, Short.MAX_VALUE)
					.addGap(18)
					.addComponent(btn2Start)
					.addGap(41))
		);
		
		JTextArea scrollAnleitung = new JTextArea();
		scrollAnleitung.setColumns(20);
		scrollAnleitung.setRows(10);
		scrollAnleitung.setTabSize(1);
		scrollAnleitung.setEditable(false);
		scrollAnleitung.setWrapStyleWord(true);
		scrollAnleitung.setLineWrap(true);
		scrollAnleitung.setForeground(new Color(255, 255, 255));
		scrollAnleitung.setBackground(new Color(0, 0, 0));
		scrollAnleitung.setFont(new Font("Monospaced", Font.BOLD, 15));
		scrollAnleitung.setText("Schere-Stein-Papier-Echse-Spock ist eine Adaption vom allseits bekannten Schere-Stein-Papier. Das Spiel wurde f\u00FCr die Einzelspielerversion leicht abgewandelt, um den Spielspa\u00DF zu erh\u00F6hen.\r\n\r\nSpielregeln:\r\nAuf dem Monitor werden schnell aufeinander folgend Bilder der Wahlm\u00F6glichkeiten\r\n( Schere, Stein, Papier, Echse, Spock ) dargestellt, jedes davon bis auf eine Ausnahme zweimal, insgesamt also neun Bilder.\r\nDas Bild welches nur einmal gezeigt wurde entspricht dem Zug des \u201EGegners\u201C und muss innerhalb von drei Sekunden gekontert werden um zu gewinnen.\r\n\r\nDie Wahlm\u00F6glichkeiten:\r\n\r\nSchere:\r\n\uF0D8 \u2026zerschneidet Papier\r\n\uF0D8 \u2026enthauptet Echse\r\n\uF076 \u2026wird von Stein zerbrochen\r\n\uF076 \u2026wird von Spock zerst\u00F6rt\r\n\r\nStein:\r\n\uF0D8 \u2026zerbricht Schwere\r\n\uF0D8 \u2026zermalmt Echse\r\n\uF076 \u2026wird von Papier umwickelt\r\n\uF076 \u2026wird von Spock verdampft\r\n\r\nPapier:\r\n\uF0D8 \u2026umwickelt Stein\r\n\uF0D8 \u2026widerlegt Spock\r\n\uF076 \u2026wird von Echse gefressen\r\n\uF076 \u2026wird von Schere zerschnitten\r\n\r\nEchse:\r\n\uF0D8 ...frisst Papier\r\n\uF0D8 \u2026vergiftet Spock\r\n\uF076 \u2026wird von Schere enthauptet\r\n\uF076 \u2026wird von Stein zermalmt\r\n\r\nSpock:\r\n\uF0D8 \u2026verdampt Stein\r\n\uF0D8 \u2026zerst\u00F6rt Schere\r\n\uF076 \u2026wird von Papier widerlegt\r\n\uF076 \u2026wird von Echse vergiftet");
		scrollPane.setViewportView(scrollAnleitung);
		Anleitung.setLayout(gl_Anleitung);
		
		
		
	}
	private class SwingAction extends AbstractAction {
		public SwingAction() {
			putValue(NAME, "SwingAction");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
		}
	}
	private class SwingAction_1 extends AbstractAction {
		public SwingAction_1() {
			putValue(NAME, "SwingAction_1");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
		}
	}
}
```

Und hier nur noch um alles zu zeigen die Klasse, welche die Randomzahlen ausgibt welche von 0-4 jeweils für 1 Panel stehen.


```
package Main;
import java.util.*;

public class Randomizer {
	String uebergabe;
	public String random(String randomZahl[]){
	   
      
      double zahlRem = Math.random();
      int zahlRemint = (int) (zahlRem * 10);
      //System.out.println(zahlRemint);  
      Collections.shuffle(Arrays.asList(randomZahl));
     for (int i = 0; i < randomZahl.length; i++) {
		if(i != zahlRemint){
			//System.out.println(randomZahl[i]);
		}
	}   
     uebergabe = randomZahl[zahlRemint];
     return uebergabe;
   }
	}
```

Hier noch damit es deutlicher wird ein DropBox Link zu der .jar Datei.
Wenn man auf "Spiel Starten" klickt soll auf der nächsten "Seite" mittig eigentlich das jeweilige Panel erscheinen.

https://www.dropbox.com/sh/fu3d8t4pxh43nky/D9cWwJ_TpJ

Danke

SciMan


----------



## SciMan (3. Jan 2013)

Sorry für den Doppelpost,

gerade gemerkt, dass es mit dem Fett u. Kursiv nicht so geklappt hat.
Deshalb hier mal die Zeilen welche meiner Meinung nach am wichtigsten für das Problem sind.

Die Panels : 303-384

Der Button : 439-478

Nochmal danke.

lg SciMan


----------



## Spacerat (3. Jan 2013)

Ob Bold-Italic oder nicht, da fehlt zumindest überall ein "panelAnzeige.revalidate()". Das wird benötigt, wenn man auf einer Live-GUI Elemente hinzufügen (add) oder entfernen (remove) will und zwar unmittelbar nach einer solchen Aktion.
Alles in allem würde ich den Code aber ohnehin noch mal überarbeiten, wobei überarbeiten in diesem Fall wohl "in Tonne kloppen und neu anfangen". Neu anfangen dann aber nicht ohne Grunddesign (z.B. MVC). Zumindest gehören Mehrzeiler wie Zeilen 235 - 272 nicht in ernst zu nehmenden Code.


----------



## SciMan (3. Jan 2013)

Danke, habe vorher noch nie was von repaint() o. revalidate() gehört aber habs mir mal angeschaut.
Habe jetzt gerade ein anderes Problem und wollte zusätzlich noch fragen ob das so mit dem repaint() stimmt.

Habe mal für die ganzen Label eine extra Klasse erstellt, mit einer Methode welche vom Button aufgerufen wird und dann eigentlich im jeweiligen "case" das Panel/Label erstellen soll.
Und damit das ganze nicht zu schnell durchläuft sind noch "Thread.sleep();" dazwischen.
Leider machen genau diese mir gerade Probleme.
Wenn ich auf Start klicke hängt sich alles für die eingetragene Zeit x 9 ( 9 Label sollen ja angezeigt werden ) auf.
Also z.B. bei Thread.sleep(1000); hängt sich das Game 9sec auf was ja darauf schließen lässt, dass im Hintergrund die switch-Anweisung schon korrekt durchgearbeitet wird.

Wegen dem oben geposteten Code, ich weis, dass es verdammt unübersichtlich ist und wohl nichts mit guter Programmierung zu tun hat. Allerdings haben wir leider nicht das wissen/können dazu. Wir mussten in 4 Monaten ein Spiel wie dieses erstellen ohne vorher jemals eine GUI erstellt zu haben.
Daher wurden wir angewiesen VisualEditor oder Windowbuilder zu nutzen und der erzeugt nunmal diesen Code und alles neu zu machen oder vielleicht sogar die komplette GUI selbst zu programmieren reicht die Zeit nicht aus.

Hier mal der Code : 


```
package Main;

import java.awt.Color;
import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Labels {
	
	public void labelAufruf (){
		System.out.println("geht");
		JPanel panelAnzeige = new JPanel();
		Randomizer rnd = new Randomizer();
		String[] randomZahl={"0","0","1","1","2","2","3","3","4","4"};
		rnd.random(randomZahl);
		
		
		
		
		for(int x=0;x<9;x++){
			switch(randomZahl[x]){
			
			case "0":
				JLabel lblEchse = new JLabel("ECHSE");
				lblEchse.setHorizontalAlignment(SwingConstants.CENTER);
				lblEchse.setFont(new Font("Impact", Font.PLAIN, 80));
				lblEchse.setForeground(new Color(255, 255, 255));
				panelAnzeige.add(lblEchse, "name_45662879437764");
				panelAnzeige.repaint();
				try {
					wait(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
			
			case "1":
				JLabel lblPapier = new JLabel("PAPIER");
				lblPapier.setFont(new Font("Impact", Font.PLAIN, 80));
				lblPapier.setForeground(new Color(255, 255, 255));
				lblPapier.setHorizontalAlignment(SwingConstants.CENTER);
				panelAnzeige.add(lblPapier, "name_45592279956646");
				panelAnzeige.repaint();
				try {
					wait(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
			case "2":
				JLabel lblStein = new JLabel("STEIN");
				lblStein.setHorizontalAlignment(SwingConstants.CENTER);
				lblStein.setFont(new Font("Impact", Font.PLAIN, 80));
				lblStein.setForeground(new Color(255, 255, 255));
				panelAnzeige.add(lblStein, "name_45514248576573");
				panelAnzeige.repaint();
				try {
					wait(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
			case "3":
				JLabel lblSchere = new JLabel("SCHERE");
				lblSchere.setBackground(new Color(0, 0, 0));
				lblSchere.setForeground(new Color(255, 255, 255));
				lblSchere.setFont(new Font("Impact", Font.PLAIN, 80));
				lblSchere.setHorizontalAlignment(SwingConstants.CENTER);
				panelAnzeige.add(lblSchere, "name_45243146397439");
				panelAnzeige.repaint();
				try {
					wait(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
			case "4":
				JLabel lblSpock = new JLabel("SPOCK");
				lblSpock.setFont(new Font("Impact", Font.PLAIN, 80));
				lblSpock.setForeground(new Color(255, 255, 255));
				lblSpock.setHorizontalAlignment(SwingConstants.CENTER);
				panelAnzeige.add(lblSpock, "name_45709799146917");
				panelAnzeige.repaint();
				try {
					wait(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
					
			}
		}
	}

}
```


```
JButton btn2Start = new JButton("SPIEL STARTEN");
		btn2Start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Labels lbl1 = new Labels();
				start = true;
				Home.setVisible(false);
				Anleitung.setVisible(false);
				Game.setVisible(true);
				System.out.println(start);
				lbl1.labelAufruf();
			}
		});
```

Danke euch.

lg Simon


----------



## SciMan (3. Jan 2013)

Oh man sorry den falschen Code gepostet, hatte gerade noch wait(); anstatt von Thread.sleep(); getestet daher noch das wait(); in jedem Case, da muss natürlich Thread.sleep(); rein.


----------



## Marco13 (3. Jan 2013)

[ot]


Spacerat hat gesagt.:


> Zumindest gehören Mehrzeiler wie Zeilen 235 - 272 nicht in ernst zu nehmenden Code.



Das ist eben das, was GUI-Builder so generieren :bahnhof: 
[/ot]


----------



## Spacerat (3. Jan 2013)

[ot]





Marco13 hat gesagt.:


> Das ist eben das, was GUI-Builder so generieren :bahnhof:


Da fällt mir auf Anhieb 'nen uralter Fernseh-Klamauk ein... Ähh, wie bitte? [/ot]
@TO: Wer hat denn was von "repaint()" gesagt? Naja, wie auch immer, auch dieser wird nach einer solchen Aktion natürlich auch fällig, wenn du nur mit Events arbeitest. Vorher muss aber trotzdem revalidiert werden, dass macht "repaint()" afaik nicht automatisch. BTW.: Vor Java7 bedeutete "revalidate();" noch "invalidate(); validate();".


----------



## SciMan (3. Jan 2013)

Beim googlen nach revalidate(); bin ich eben auch auf repaint(); gestoßen und ich habe beides getestet, wollte eigentlich nur wissen ob ich es so richtig angewendet habe. Trotz allem ging es mir gerade um das Thread.sleep(); wodurch ich die Seite wo die Labels/Panels sein sollten ja garnicht erst zu sehen bekomme bzw. erst nach der entsprechenden Zeit und ich leider absolut nicht verstehe wieso, da Thread.sleep(); sich ja nur bei den Labels befindet und nicht das ganzen Spiel stoppen sollte.

Hier nochmal der Code mit revalidate und jetzt mit Thread.sleep(); anstatt wait();, so wie es sein sollte.


```
package Main;

import java.awt.Color;
import java.awt.Font;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class Labels {
	
	public void labelAufruf (){
		System.out.println("geht");
		JPanel panelAnzeige = new JPanel();
		Randomizer rnd = new Randomizer();
		String[] randomZahl={"0","0","1","1","2","2","3","3","4","4"};
		rnd.random(randomZahl);
		
		
		
		
		for(int x=0;x<9;x++){
			switch(randomZahl[x]){
			
			case "0":
				JLabel lblEchse = new JLabel("ECHSE");
				lblEchse.setHorizontalAlignment(SwingConstants.CENTER);
				lblEchse.setFont(new Font("Impact", Font.PLAIN, 80));
				lblEchse.setForeground(new Color(255, 255, 255));
				panelAnzeige.add(lblEchse, "name_45662879437764");
				panelAnzeige.revalidate();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
			
			case "1":
				JLabel lblPapier = new JLabel("PAPIER");
				lblPapier.setFont(new Font("Impact", Font.PLAIN, 80));
				lblPapier.setForeground(new Color(255, 255, 255));
				lblPapier.setHorizontalAlignment(SwingConstants.CENTER);
				panelAnzeige.add(lblPapier, "name_45592279956646");
				panelAnzeige.revalidate();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
			case "2":
				JLabel lblStein = new JLabel("STEIN");
				lblStein.setHorizontalAlignment(SwingConstants.CENTER);
				lblStein.setFont(new Font("Impact", Font.PLAIN, 80));
				lblStein.setForeground(new Color(255, 255, 255));
				panelAnzeige.add(lblStein, "name_45514248576573");
				panelAnzeige.revalidate();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
			case "3":
				JLabel lblSchere = new JLabel("SCHERE");
				lblSchere.setBackground(new Color(0, 0, 0));
				lblSchere.setForeground(new Color(255, 255, 255));
				lblSchere.setFont(new Font("Impact", Font.PLAIN, 80));
				lblSchere.setHorizontalAlignment(SwingConstants.CENTER);
				panelAnzeige.add(lblSchere, "name_45243146397439");
				panelAnzeige.revalidate();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
			case "4":
				JLabel lblSpock = new JLabel("SPOCK");
				lblSpock.setFont(new Font("Impact", Font.PLAIN, 80));
				lblSpock.setForeground(new Color(255, 255, 255));
				lblSpock.setHorizontalAlignment(SwingConstants.CENTER);
				panelAnzeige.add(lblSpock, "name_45709799146917");
				panelAnzeige.revalidate();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				continue;
				
					
			}
		}
	}

}
```

Nochmal kurz erklärt wo das Problem ist...ich klicke auf Start und das Spiel wechselt nicht auf die richtige Oberfläche sondern bleibt 9x1000ms hängen ( Thread.sleep(1000); ) danach wechselt es die Oberfläche allerdings sind die Labels ja dann schon alle gewechselt.

Danke


----------



## Spacerat (3. Jan 2013)

Oh shit... jetzt sieht's auch mein ungeschultes Auge XD. Du rufst "repaint()" ja auch mehrmals innerhalb des EDT (EventDispatchThread) auf. Der Trick ist, die Labelsls erst nach dem Verlassen des EDT zu mischen und der Reihe nach anzuzeigen. Das geht mit einem separatem Thread im übrigen simpler als gedacht, mich wundert nur, warum das dort nicht auch mit "EventQueue.invokeLater()" geht, aber darüber können sich mit Sicherheit die äussern, die sich mit Swing besser auskennen als ich. Ich hab' mir mal gestattet, deine Klassen ein wenig umzuschreiben, so dass folgendes KSKB heraus kam:

```
package Main;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class SSPES {
	public static void main(String[] args) {
		final JFrame frame = new JFrame();
		frame.setLayout(new GridLayout(2, 1));
		final JButton start = new JButton("start");
		final Labels lbls = new Labels();
		final ActionListener al = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				lbls.shuffle();
				start.setEnabled(false);
				new Thread("shuffleThread") {
					@Override
					public void run() {
						for(JLabel l : lbls) {
							frame.add(l);
							frame.revalidate();
							frame.repaint();
							try {
								Thread.sleep(1000);
							} catch(InterruptedException e) {
							}
							frame.remove(l);
						}
						start.setEnabled(true);
					}
				}.start();
			}
		};
		start.addActionListener(al);
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				frame.add(start);
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

class Labels implements Iterable<JLabel> {
	private static final Color color = Color.WHITE;
	private static final Font font = new Font("Impact", Font.PLAIN, 80);

	private final List<String> types = new ArrayList<>(Arrays.asList(new String[] {
		"STEIN", "SCHERE", "PAPIER", "ECHSE", "SPOCK",
		"STEIN", "SCHERE", "PAPIER", "ECHSE", "SPOCK",
	}));
	
	public void shuffle() {
		Collections.shuffle(types);
	}

	@Override
	public Iterator<JLabel> iterator() {
		return new Iterator<JLabel>() {
			Iterator<String> intern = types.iterator();
			@Override
			public boolean hasNext() {
				return intern.hasNext();
			}

			@Override
			public JLabel next() {
				String t = intern.next();
				JLabel label = new JLabel(t);
				label.setFont(font);
				label.setForeground(color);
				label.setHorizontalAlignment(SwingConstants.CENTER);
				return label;
			}

			@Override
			public void remove() {
				throw new UnsupportedOperationException();
			}
		};
	}
}
```


----------



## Marco13 (3. Jan 2013)

Das 
frame.add(l); und
start.setEnabled(true);
müßte dann eigentlich wieder auf den EDT. Aber... repaint() kann man aufrufen, von wo man will - auch aus dem EDT :bahnhof:


----------



## Spacerat (4. Jan 2013)

Marco13 hat gesagt.:


> Das
> frame.add(l); und
> start.setEnabled(true);
> müßte dann eigentlich wieder auf den EDT. Aber... repaint() kann man aufrufen, von wo man will - auch aus dem EDT :bahnhof:


So wollte ich das eigentlich auch haben. Aber irgendwie musste "actionPerformed()" erstmal verlassen werden, bevor man die Labels einmal durchgeht, sonst sieht man ja (siehe Problem des TO) von dem Gewechsel immer nur den Schluss. Ich hab' mich, wie oben angedeutet, damit auch schon ein wenig beschäftigt, es nur, aufgrund mangelder Erfahrung in Swing, nicht hinbekommen. Die Wechsel in der "paintComponent()"-Methode eines JPanels unterzubringen, ist wohl nicht angemessen, obwohl diese ja auch auf dem EDT läuft. Wie würdest du es machen?


----------



## Marco13 (4. Jan 2013)

Naja... "verlassen" wird sie ja sofort, nachdem der Thread erstellt und gestartet wurde. Ganz pragmatisch kann man da überall das berühmte SwingUtilities.invokeLater drumwickeln

```
public class SSPES {
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2, 1));
        final JButton start = new JButton("start");
        final Labels lbls = new Labels();
        final ActionListener al = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                lbls.shuffle();
                start.setEnabled(false);
                new Thread("shuffleThread") {
                    @Override
                    public void run() {
                        for(final JLabel l : lbls) {
                            SwingUtilities.invokeLater(new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    frame.add(l);
                                    frame.revalidate();
                                    frame.repaint();
                                }
                            });
                            try {
                                Thread.sleep(1000);
                            } catch(InterruptedException e) {
                                Thread.currentThread().interrupt();
                                return;
                            }
                            SwingUtilities.invokeLater(new Runnable()
                            {
                                @Override
                                public void run()
                                {
                                    frame.remove(l);
                                }
                            });
                        }
                        SwingUtilities.invokeLater(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                start.setEnabled(true);
                            }
                        });
                    }
                }.start();
            }
        };
        start.addActionListener(al);
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.add(start);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}
```
auch wenn diese Einrückung natürlich :autsch: ist, und man das zumindest in Methoden auslagern oder vielleicht gleich mit einem SwingTimer lösen sollte...


----------



## Spacerat (4. Jan 2013)

:lol: ...ich sagte, evtl. jemand, der sich mit Swing besser auskennt... Wo bitte ist der Unterschied zwischen "EventQueue.invokeLater();" und "SwingUtilities.invokeLater()"? Schau mal in die API . Naja, nichts für ungut, die Einrückungen sind wirklich :autsch:. Ich hatte zuvor angenommen, dass dieses funktioniert, tut es aber nicht.

```
package Main;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class SSPES {
	public static void main(String[] args) {
		final JFrame frame = new JFrame();
		frame.setLayout(new GridLayout(2, 1));
		final JButton start = new JButton("start");
		final Labels lbls = new Labels();
		final ActionListener al = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				lbls.shuffle();
				start.setEnabled(false);
//				SwingUtilities.invokeLater(new Runnable() {
				EventQueue.invokeLater(new Runnable() {
					@Override
					public void run() {
						for(JLabel l : lbls) {
							frame.add(l);
							frame.revalidate();
							frame.repaint();
							try {
								Thread.sleep(1000);
							} catch(InterruptedException e) {
							}
							frame.remove(l);
						}
						start.setEnabled(true);
					}
				});
			}
		};
		start.addActionListener(al);
//		SwingUtilities.invokeLater(new Runnable() {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				frame.add(start);
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}
```
Und wenn dieses "invokeLater()" von woher auch immer, so'n Spagetticode verursacht und man um den Thread sowieso nicht drum herum kommt, dann pfeiff doch drauf. Und mit so 'nem SwingTimer scheint's auch nicht übersichtlicher zu werden.


----------



## Marco13 (4. Jan 2013)

Dass SwingUtilities.invokeLater und  EventQueue.invokeLater praktisch das gleiche sind, weiß ich. Ich habe mir aber ersteres angewöhnt, ... es ist ja egal :bahnhof:

Bei dem zuletzt geposteten wird ja ALLES (im speziellen auch das Thread.sleep) vom EDT gemacht. Das wichtige ist ja das "hin und her" zwischen dem EDT und dem, der dem EDT sagt, was er als nächstes machen soll.

Aber wenn es darum geht, würde ich das ganze von Grund auf anders aufziehen. Ein neues JLabel zu erstellen, wenn nur ein Text geändert werden muss, ist ... *räusper*... 

EIN Alternativvorschlag (von vielen möglichen), mal mit einem SwingWorker

```
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class SSPES
{
    private static final List<String> strings = Arrays.asList(new String[] {
        "STEIN", "SCHERE", "PAPIER", "ECHSE", "SPOCK", "STEIN", "SCHERE",
        "PAPIER", "ECHSE", "SPOCK", });

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(2, 1));

        final JLabel label = new JLabel();
        final JButton start = new JButton("start");
        final ActionListener al = new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                run(start, label);
            }
        };
        start.addActionListener(al);

        frame.add(start);
        frame.add(label);
        frame.setSize(400,300);
        frame.setVisible(true);
    }
    
    private static void run(final JButton start, final JLabel label)
    {
        start.setEnabled(false);
        SwingWorker<Void, String> worker = new SwingWorker<Void, String>()
        {
            @Override
            protected Void doInBackground() throws Exception
            {
                List<String> currentStrings = new ArrayList<String>(strings);
                Collections.shuffle(currentStrings);
                for (String s : currentStrings)
                {
                    publish(s);
                    try
                    {
                        Thread.sleep(400);
                    }
                    catch (InterruptedException e)
                    {
                        Thread.currentThread().interrupt();
                        return null;
                    }
                }
                return null;
            }
            
            @Override
            protected void process(List<String> chunks)
            {
                label.setText(chunks.get(chunks.size()-1));
            }
            
            @Override
            protected void done()
            {
                start.setEnabled(true);
            }
        };
        worker.execute();
    }
    
}
```
(natürlich würde es in einer "richtigen" Anwendung etwas anders aussehen, Button/Label könnten dann Fields sein, aber das Prinzip wäre das gleiche...)


----------



## Spacerat (4. Jan 2013)

Das sieht schon eher nach von dir gewohntem Code aus... :applaus:


----------

