# Hilfe! Java Swing



## deddy (9. Januar 2010)

Da ich am 29.01.2010 diese kleines Speil abgeben muss, brauche dringend Hilfe..

Die Oberfläche:


```
package spiel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;

import javax.swing.*;






public class puzzle extends JFrame implements ActionListener{
	
	private JPanel panel1, panel2;
	private Image source;
	//für panel1
	private JButton button0,button1,button2,button3,button4,button5,button6,button7,button8,button9,button10,button11;
	private JButton button_0,button_1,button_2,button_3,button_4,button_5,button_6,button_7,button_8,button_9,button_10,button_11;
	//für panel2
	private Image image0,image1,image2,image3,image4,image5,image6,image7,image8,image9,image10,image11;
	private Image image_0,image_1,image_2,image_3,image_4,image_5,image_6,image_7,image_8,image_9,image_10,image_11;
	int width, height;
	public puzzle(){
		panel1 = new JPanel();
		panel2 = new JPanel();
		panel1.setLayout(new GridLayout(4,4,0,0));
		panel2.setLayout(new GridLayout(4,4,0,0));
	
		
		ImageIcon theMonsters = new ImageIcon(puzzle.class.getResource("front.jpg"));
		source = theMonsters.getImage();
		
		width = theMonsters.getIconWidth();
		height = theMonsters.getIconHeight();
		
		add(Box.createRigidArea(new Dimension(0,5)), BorderLayout.NORTH);
		add(panel1, BorderLayout.WEST);
		
		button0 = new JButton();
		button0.addActionListener(this);
		panel1.add(button0);
		image0 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 0*height/4, (width/3)+1, height/4))); 
		button0.setIcon(new ImageIcon(image0));
		

		button1 = new JButton();
		button1.addActionListener(this);
		panel1.add(button1);
		image1 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 0*height/4, (width/3)+1, height/4))); 
		button1.setIcon(new ImageIcon(image1));
		

		button2 = new JButton();
		button2.addActionListener(this);
		panel1.add(button2);
		image2 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 0*height/4, (width/3)+1, height/4))); 
		button2.setIcon(new ImageIcon(image2));
		

		button3 = new JButton();
		button3.addActionListener(this);
		panel1.add(button3);
		image3 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 1*height/4, (width/3)+1, height/4))); 
		button3.setIcon(new ImageIcon(image3));
		

		button4 = new JButton();
		button4.addActionListener(this);
		panel1.add(button4);
		image4 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 1*height/4, (width/3)+1, height/4))); 
		button4.setIcon(new ImageIcon(image4));
		

		button5 = new JButton();
		button5.addActionListener(this);
		panel1.add(button5);
		image5 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 1*height/4, (width/3)+1, height/4))); 
		button5.setIcon(new ImageIcon(image5));
		

		button6 = new JButton();
		button6.addActionListener(this);
		panel1.add(button6);
		image6 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 2*height/4, (width/3)+1, height/4))); 
		button6.setIcon(new ImageIcon(image6));
		

		button7 = new JButton();
		button7.addActionListener(this);
		panel1.add(button7);
		image7 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 2*height/4, (width/3)+1, height/4))); 
		button7.setIcon(new ImageIcon(image7));
		

		button8 = new JButton();
		button8.addActionListener(this);
		panel1.add(button8);
		image8 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 2*height/4, (width/3)+1, height/4))); 
		button8.setIcon(new ImageIcon(image8));
		

		button9 = new JButton();
		button9.addActionListener(this);
		panel1.add(button9);
		image9 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 3*height/4, (width/3)+1, height/4))); 
		button9.setIcon(new ImageIcon(image9));
		

		button10 = new JButton();
		button10.addActionListener(this);
		panel1.add(button10);
		image10 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 3*height/4, (width/3)+1, height/4))); 
		button10.setIcon(new ImageIcon(image10));
		

		button11 = new JButton();
		button11.addActionListener(this);
		panel1.add(button11);
		image11 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 3*height/4, (width/3)+1, height/4))); 
		button11.setIcon(new ImageIcon(image11));
		//ende für Panel 1, anfang panel 2
	
		
		add(Box.createRigidArea(new Dimension(0,5)), BorderLayout.NORTH);
		add(panel2, BorderLayout.EAST);
		
		button_0 = new JButton();
		button_0.addActionListener(this);
		panel2.add(button_0);
		image_0 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 0*height/4, (width/3)+1, height/4))); 
		button_0.setIcon(new ImageIcon(image_0));
		

		button_1 = new JButton();
		button_1.addActionListener(this);
		panel2.add(button_1);
		image_1 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 0*height/4, (width/3)+1, height/4))); 
		button_1.setIcon(new ImageIcon(image_1));
		

		button_2 = new JButton();
		button_2.addActionListener(this);
		panel2.add(button_2);
		image_2 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 0*height/4, (width/3)+1, height/4))); 
		button_2.setIcon(new ImageIcon(image_2));
		

		button_3 = new JButton();
		button_3.addActionListener(this);
		panel2.add(button_3);
		image_3 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 1*height/4, (width/3)+1, height/4))); 
		button_3.setIcon(new ImageIcon(image_3));
		

		button_4 = new JButton();
		button_4.addActionListener(this);
		panel2.add(button_4);
		image_4 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 1*height/4, (width/3)+1, height/4))); 
		button_4.setIcon(new ImageIcon(image_4));
		

		button_5 = new JButton();
		button_5.addActionListener(this);
		panel2.add(button_5);
		image_5 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 1*height/4, (width/3)+1, height/4))); 
		button_5.setIcon(new ImageIcon(image_5));
		

		button_6 = new JButton();
		button_6.addActionListener(this);
		panel2.add(button_6);
		image_6 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 2*height/4, (width/3)+1, height/4))); 
		button_6.setIcon(new ImageIcon(image_6));
		

		button_7 = new JButton();
		button_7.addActionListener(this);
		panel2.add(button_7);
		image_7 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 2*height/4, (width/3)+1, height/4))); 
		button_7.setIcon(new ImageIcon(image_7));
		

		button_8 = new JButton();
		button_8.addActionListener(this);
		panel2.add(button_8);
		image_8 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 2*height/4, (width/3)+1, height/4))); 
		button_8.setIcon(new ImageIcon(image_8));
		

		button_9 = new JButton();
		button_9.addActionListener(this);
		panel2.add(button_9);
		image_9 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(0*width/3, 3*height/4, (width/3)+1, height/4))); 
		button_9.setIcon(new ImageIcon(image_9));
		

		button_10 = new JButton();
		button_10.addActionListener(this);
		panel2.add(button_10);
		image_10 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(1*width/3, 3*height/4, (width/3)+1, height/4))); 
		button_10.setIcon(new ImageIcon(image_10));
		

		button_11 = new JButton();
		button_11.addActionListener(this);
		panel2.add(button_11);
		image_11 = createImage(new FilteredImageSource(source.getSource(),
				new CropImageFilter(2*width/3, 3*height/4, (width/3)+1, height/4))); 
		button_11.setIcon(new ImageIcon(image_11));

		setSize(1100, 480);
		setTitle("Puzzle");
		setResizable(true);
		setLocation(100,100);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
		
		
		
	}
	

	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	 public static void main(String[] args) {

	        new puzzle();

	 }

}
```



wie kann ich die Bilder vertauschen?.. wenn z.b: ich klicke ein bildteil von dem linken puzzle und ein Bildteil von dem rechten puzzle, sollten die bilder ihre Position tauschen.

gruß


----------



## DosCoder (9. Januar 2010)

Hi,
so plump wie du die Frage gestellt hast, so plump stelle ich die Antwort:
1. Ersten Buttondruck abspeichern
2. Beim zweiten Buttondruck die Bilder vertauschen
3. Speichereintrag löschen

Damit das auf tutorials.de besser funktioniert, wird zumindest ein _Ansatz_ vorausgesetzt, denn hier weiß jetzt keiner wo dein Problem ist. Wie wäre es mit einem Ansatz zum Problem, du erkärst, was du nicht schaffst und wir helfen dir weiter.
Das ist nicht böse gemeint, aber keiner hat 1) Lust sich in Quellcode einzuarbeiten, dessen Sinn er nicht versteht (du sagest, es wird ein Puzzle werden aber nicht welcher Art. Ich kenne kein Puzzle mit einem linkem und einem rechtem Teil) und 2) Lust, dein Problem zu _erraten_.

Also, auf ein Neues,
DosCoder


----------



## deddy (9. Januar 2010)

mein Problem liegt da, ich weiss nicht wie ich in der actionPerformed(ActionEvent e) den ersten buttondruck abspeichern, und beim zweiten die Bilder vertauschen und den Speichereintrag löscht.
Ich weiss nicht die Idee zu realisieren..

Das Puzzlespiel gibts noch nicht, das ist ein spiel, das ich selber ausdenkt. 

das andere ist, dass die einzelnbilder zuerst vertauscht werden, dass das Spiel ein Puzzle ist.

das Spiel: vertauschte Bilder zurück zu setzen, in dem ein Bild von linken panel klickt und ein Bild von rechtem Panel klickt und dass die Positionen sich ändern. das Spiel beendet, wenn die Bilder in ihre Positonen sind.

mfg


----------



## Kai008 (9. Januar 2010)

Klassennamen schreibt man groß.
Warum speicherst du den ersten Button per ActionEvent.getSource nicht einfach in ne Klassenvariable? Wäre wohl der simpelste Weg.
Bildervertauschen ist einfach: 1 -> Cachevariable, 2 -> 1, Cachevariable -> 2.


----------



## deddy (9. Januar 2010)

ich brauche irgendwas reales, was ich bearbeiten kann. ich habe nicht so viele Ahnung und es sind soviele wege nach Rome in Java...

ja die klassenname ändere ich.  Aber  wie man macht, wie DosCoder empfiehlt, weisse ich nicht.. buttondruck Abspeichern zu schreiben in Google hilft nichts konkretes


----------



## DosCoder (9. Januar 2010)

Hi,
du sollst eine Variable als _JButton_ deklarieren und dort dann den zuerst gedrückt Button hineinschreiben. Wenn der nächste Button gedrückt wurde, dann musst du zuerst schauen, ob diese Variable schon belegt ist. Wenn ja, dann hast du doch den zuvor gedrückten Button und den gerade gedrückten. Dann kannst du die Bilder vertauschen.
Ciao
DosCoder


----------



## Kai008 (9. Januar 2010)

Entweder du vergibst jeden Button ne ID (z. B. in dem du es in ein Array oder List einträgst und in einer Schleife die beiden durchrennst bis der Button == oder equal (== vergleicht Referenzen, equal quasi den Inhalt (gerade nicht den Source zum nachsehen ob Inhalt, HashSum oder was auch immer installiert), == sollte warscheinlich auch funktionieren aber musst du schauen ob wirklich beim Source die selbe Referenz rauskommt) dem Source oder du überschreibst gleich JButton und speicherst die ID intern in einer Klassenvariable. Du könntest auch den JButton direkt speichern, aber dann hilft dir das Wohl nur, wenn du JButton überschreibst.

Je mehr Wege nach Rom führen, umso kreativer kann man in der Routenplanung sein, solange sie jemand nachvollziehen kann.

Aber ehrlich gesagt habe ich (ohne dir was zu unterstellen zu wollen) das Gefühl, dass du dir das Programm aus verschiedenen Beispielsources zusammenflicken willst. Zwar habe ich jede Programmiersprache bisher so gelernt (mit Tutorials kann ich erst ab einer gewissen Grundkenntniss etwas anfangen), aber ich denke, dass das wohl einer der schlechtesten Wege ist eine Sprache zu lernen.


----------



## deddy (10. Januar 2010)

Ich habe die Code so geschrieben:

public void actionPerformed(ActionEvent e) {
		// if buttton1 und button2 gedrückt, wechselt sich ihre Positionen.
		JButton button = (JButton) e.getSource();
		Dimension size = button.getSize();
		int pos = new int[][] {{0,1,2}, {3,4,5}, {6,7,8}, {9,10,11}	};

		int buttonX = button0.getX();
		int buttonY = button0.getY();
		int button_X = button_0.getX();
		int button_Y = button_0.getY();
		int buttonPosX= buttonX / size.width;
		int buttonPosY= buttonY / size.height;
		int buttonIndex = pos[buttonPosY][buttonPosX];

		int buttonPos_X= button_X / size.width;
		int buttonPos_Y= button_Y / size.height;
		int button_Index = pos[buttonPos_Y][buttonPos_X];


		boolean isSet = false;

		if (button0 == e.getSource() ) {

		   System.out.println("button0 succesfull pressed");

		   if (button_0 == e.getSource() && isSet==false) {
				panel1.add(button_0, buttonIndex);
				panel2.add(button0, button_Index);
				panel1.validate();
				panel2.validate();
				          isSet = true;
				System.out.println("button_0 succesfull pressed");          
				}

		}




	}

Aber es führt nur bis if (button0 == e.getSource()  aus, dene zweiten Klickt auf button_0 wird nicht ausgeführt..

Ich bitte noch um Hilfe, wie ich das Problem löse: (Klickt auf  button1 und danach Klickt auf button_1 danach wird den Code ausgeführt)


----------



## Kai008 (10. Januar 2010)

Warscheinlich, weil button0 und button_0 nicht auf die selbe Instance verweißt. Du solltest dringend auf bessere Variablennamen umsteigen. Am einfachsten ginge es wohl in einen Array. Oder du überschreibst JButton, speicherst in der Instance die Koordinaten oder ähnliches, castest den Source runter auf die überschriebene Klasse und hohlst dir aus den Getter die Koordinaten..


----------



## DosCoder (10. Januar 2010)

Hi,
es geht doch viel einfacher:

```
public void actionPerformed(...){
   if(savedButton == null){
    savedButton = (JButton)e.getSource();
   }else{
    ImageIcon iconSaved = savedButton.getIcon();
    ImageIcon iconNew = (JButton)e.getSource();
    ((JButton)e.getSource).setIcon(icon)
    savedBbutton.setIcon(((JButton)e.getSource()).getIcon());
    savedButton = null;
   }
}
```

Der Quellcode ist etwas vereinfacht und nicht getestet, aber er könnte helfen. 
Ciao
DosCoder


----------



## deddy (10. Januar 2010)

ich habe die code noch geändert.

Ich habe eine Methode für das Bildwechsel schnell geschrieben:


public void bildWechsel(JButton button0, JButton button_0 ){
		Dimension size = button0.getSize();

		int buttonX = button0.getX();
		int buttonY = button0.getY();
		int button_X = button_0.getX();
		int button_Y = button_0.getY();
		int buttonPosX= buttonX / size.width;
		int buttonPosY= buttonY / size.height;
		int buttonIndex = pos[buttonPosY][buttonPosX];

		int buttonPos_X= button_X / size.width;
		int buttonPos_Y= button_Y / size.height;
		int button_Index = pos[buttonPos_Y][buttonPos_X];

		panel1.add(button_0, buttonIndex);
		panel2.add(button0, button_Index);
		panel1.validate();
		panel2.validate();


}



und dann die ActionEvent:

public void actionPerformed(ActionEvent e) {
		// if buttton1 und button2 gedrückt, wechselt sich ihre Positionen.





		boolean isSet = false;

		if (button0 == e.getSource() ) {


			  System.out.println("button0 succesfull pressed");

			   if (button_0 == e.getSource() && isSet==false) {
				   bildWechsel(button0,button_0);
				   isSet = true;
				   System.out.println("button_0 succesfull pressed");          
			    }

			    if (button_1 == e.getSource() && isSet==false) {
				   bildWechsel(button0,button_1);
				   isSet = true;
				   System.out.println("button_1 succesfull pressed");          
			    }	
			    //usw bis button_11	

		}


		if (button1 == e.getSource()){

	 		System.out.println("button1 succesfull pressed");

			   if (button_0 == e.getSource() && isSet==false) {
				   bildWechsel(button1,button_0);
				   isSet = true;
				   System.out.println("button_0 succesfull pressed");          
			    }

			    if (button_1 == e.getSource() && isSet==false) {
				   bildWechsel(button1,button_1);
				   isSet = true;
				   System.out.println("button_1 succesfull pressed");          
			    }	
			    //usw bis button_11	

		}
	}


Aber im moment es führt nur system.out.println("button0 succesfull pressed"); wenn ich klicke. die Code für den zweiten klickt führt es nicht aus.


----------



## Kai008 (10. Januar 2010)

Davon abgesehen, dass ich den Code ohne Code-Tags wie [ code=java ] oder wenigstens [ code ] kaum lesen kann, verstehe ich es irgendwie nicht. Du vergleichst zuerst ob button0 gedrückt wurde, in der selben if prüfst du ob button_0 gedrückt wurde. Warum speicherst du den selben Button in 2 Referenzen? Nimm doch einfach den Code, den DosCoder gepostet hat.
Zuerst wird der alte Button in eine Klassenvariable gespeichert, beim nächsten Klick werden die Icons zwischengespeichert und dann gegenseitig gesetzt. Danach wird der gespeicherte Button auf 'null' gesetzt, damit beim nächsten Klick wiederrum abgespeichert wird. Es gibt nur 2 Sachen, in Zeile 7 musst du iconSaved verwenden, in Zeile 8 iconNew (glaube ich, bin gerade nicht ganz da).


----------



## deddy (10. Januar 2010)

```
public void bildWechsel(JButton button0, JButton button_0 ){
		Dimension size = button0.getSize();
		
		int buttonX = button0.getX();
		int buttonY = button0.getY();
		int button_X = button_0.getX();
		int button_Y = button_0.getY();
		int buttonPosX= buttonX / size.width;
		int buttonPosY= buttonY / size.height;
		int buttonIndex = pos[buttonPosY][buttonPosX];
		
		int buttonPos_X= button_X / size.width;
		int buttonPos_Y= button_Y / size.height;
		int button_Index = pos[buttonPos_Y][buttonPos_X];
		
		panel1.add(button_0, buttonIndex);
		panel2.add(button0, button_Index);
		panel1.validate();
		panel2.validate();
		
		
}
```

die ActionEvent


```
public void actionPerformed(ActionEvent e) {
		// if buttton1 und button2 gedrückt, wechselt sich ihre Positionen.

		
		
		
		
		boolean isSet = false;

		if (button0 == e.getSource() ) {
			   
			
			  System.out.println("button0 succesfull pressed");
			   
			   if (button_0 == e.getSource() && isSet==false) {
				   bildWechsel(button0,button_0);
				   isSet = true;
				   System.out.println("button_0 succesfull pressed");          
			    }

			    if (button_1 == e.getSource() && isSet==false) {
				   bildWechsel(button0,button_1);
				   isSet = true;
				   System.out.println("button_1 succesfull pressed");          
			    }	
			    //usw bis button_11	
			
		}

			
		if (button1 == e.getSource()){

	 		System.out.println("button1 succesfull pressed");
			   
			   if (button_0 == e.getSource() && isSet==false) {
				   bildWechsel(button1,button_0);
				   isSet = true;
				   System.out.println("button_0 succesfull pressed");          
			    }

			    if (button_1 == e.getSource() && isSet==false) {
				   bildWechsel(button1,button_1);
				   isSet = true;
				   System.out.println("button_1 succesfull pressed");          
			    }	
			    //usw bis button_11	
			
		}
}
```

Ich habe die Button für Panel1 button0,button1,button2,..,button11
und für die Panel2 button_0,button_1,button_2,..button_11 genannt.

panel 1 am linken, panel2 am rechten...
ich weiss nicht wie ich die Screen shot von dem Spiel anhängen kann.


----------



## Kai008 (10. Januar 2010)

Controll + Print ist eine Screenshot von der Anwendung, die gerade den Focus hat, Print einer vom gesamten Bildschirminhalt.
Dann Paint (mspaint.exe bei XP) öffnen, mit Controll + V einfügen und in eine Datei als png oder ähnliches Format (am besten jpg, bmp ist zu groß und gif führt i. d. R. zu erheblichen Farbverlust) speichern und bei einen neuen Post bei "Anhänge verwalten" hochladen.


----------



## deddy (10. Januar 2010)

Hier ist noch Das Bild von dem Spiel...


----------



## deddy (10. Januar 2010)

die Code habe von dosCoder habe ich probiert. Es hört auf nach dem if

<java> public void actionPerformed(ActionEvent e) {
		// if buttton1 und button2 gedrückt, wechselt sich ihre Positionen.

		JButton savedButton = null;
		JButton newButton;


		if (savedButton == null){
			savedButton = (JButton)e.getSource();
			System.out.println("button0 succesfull pressed");
		}else{
		    ImageIcon iconSaved =  (ImageIcon) savedButton.getIcon();
		    ImageIcon iconNew = (ImageIcon)e.getSource();
		    newButton = (JButton)e.getSource();
		    newButton.setIcon(iconSaved);
		    savedButton.setIcon(((JButton)e.getSource()).getIcon());
		    savedButton = null;
		    System.out.println("ich bin hier");
}   </java>


----------



## Kai008 (11. Januar 2010)

Also, wenn ich das jetzt alles in allem richtig verstanden habe, willst du per Klicks jeweils das Bild von einen Button des Linken und einen des Rechten teils vertauschen.

Das ist doch kein Problem. Du hast sogar von DosCoder einen Beispielsource bekommen.
Schau dir mal den Anhang an, ABER NUR ZUM LERNEN. Wenn du es nicht schaffst deinen Code bis auf die letzte Zeile zu erklären, wirst du später eher sehr schwer weiterkommen. Und ich möchte nicht an deiner schlechten Note schuld sein. (War nur so ein Spruch.)

Edit: Er muss doch nach den if aufhören, steht ja nicht mehr da.


----------



## deddy (11. Januar 2010)

Ich kann die Jar Datei nicht öffnen...
Hast du die nur auf .java?

Mit 2 Klicks kann man das linken Bild mit dem rechten Bild vertauschen, und auch von rechten mit dem linken, wenn man zuerst das rechten Bild klickt, danach das linken Bild klickt.

Ich weisse es nicht, wie man ActionEvent ausführt nachdem zweiten klickt.. Normaleweise, man klickt, wird danach die Code ausgeführt.
Mein Plan ist, Ich klicke einen Button, danach klicke ich den zweiten Button, danach wird der Code ausgeführt, wo das Bild von dem ersten Button mit dem zweiten Button vertauschen werden.

Wenn ich das bekomme, muss ich noch die beide Panel "schüteln", so dass die Bilder nicht wie so aussieht wie im Anhang.


----------



## Kai008 (11. Januar 2010)

Mit WinRAR kann man sie problemlos öffnen. Von andere Programme, außer natürlich der JRE weiß ich es nicht bestimmt.
Wird es ja. Das erste mal wird der Button abgespeichert, das 2. mal werden die Bilder ausgetauscht.


----------



## deddy (11. Januar 2010)

das Programm gibt Fehlermeldung aus..
Meldung: Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file

Und ich kann die Quellcode auch nicht lesen...


----------



## Kai008 (11. Januar 2010)

Verstehe ich nicht, bei mir funktioniert es problemlos.


```
package app;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;

public class BildWechsel implements ActionListener
{
	private static final byte WEST_BUTTON_PANEL = 0;
	private static final byte EAST_BUTTON_PANEL = 1;
	
	private static final byte BUTTON_SOURCE = 0;
	private static final byte BUTTON_DESTINATE = 1;

	private static JPanel[] buttonPanels;
	private static Icon[][] icons;
	
	private JButton pressedButton;
	
	public static void main(String[] args)
	{
		splitImage();
		setFrame();
	}
	
	private static void splitImage()
	{
		icons = new Icon[3][3];
		ImageIcon originalIcon = new ImageIcon("image.png");
		for(byte b = 0, x = 0, y = 0; b < 9; b++, x++)
		{
			BufferedImage newImage = new BufferedImage(30, 30, BufferedImage.TYPE_INT_RGB);
			Graphics g = newImage.getGraphics();
			g.drawImage(originalIcon.getImage(), x * 30 * -1, y * 30 * -1, null);
			g.dispose();
			
			icons[x][y] = new ImageIcon(newImage);
			
			if(x == 2)
			{
				x = -1;
				y++;
			}
		}
	}
	private static void setFrame()
	{
		JFrame frame = new JFrame("");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(230, 140);
		frame.setLayout(null); //TODO Eventuell FlowLayout?
		
		buttonPanels = new JPanel[2];
		
		buttonPanels[EAST_BUTTON_PANEL] = new JPanel(null); //TODO GridLayout?
		buttonPanels[EAST_BUTTON_PANEL].setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
		buttonPanels[EAST_BUTTON_PANEL].setBounds(0, 0, 110, 110);
		frame.add(buttonPanels[EAST_BUTTON_PANEL]);
		
		BildWechsel bildWechsel = new BildWechsel();
		for(byte b = 0, x = 0, y = 0; b < 9; b++, x++)
		{
			JButton button = new JButton(icons[x][y]);
			button.setBounds(30 * x + 10, 30 * y + 10, 30, 30);
			button.addActionListener(bildWechsel);
			buttonPanels[EAST_BUTTON_PANEL].add(button);
			
			if(x == 2)
			{
				x = -1;
				y++;
			}
		}
		
		buttonPanels[WEST_BUTTON_PANEL] = new JPanel(null); //TODO
		buttonPanels[WEST_BUTTON_PANEL].setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
		buttonPanels[WEST_BUTTON_PANEL].setBounds(110, 0, 110, 110);
		frame.add(buttonPanels[WEST_BUTTON_PANEL]);
		
		for(byte b = 0, x = 0, y = 0; b < 9; b++, x++)
		{
			JButton button = new JButton(icons[x][y]);
			button.setBounds(30 * x + 10, 30 * y + 10, 30, 30);
			button.addActionListener(bildWechsel);
			buttonPanels[WEST_BUTTON_PANEL].add(button);
			
			if(x == 2)
			{
				x = -1;
				y++;
			}
		}
		
		frame.setVisible(true);
	}

	public void actionPerformed(ActionEvent e)
	{
		if(pressedButton == null)
		{
			pressedButton = (JButton)e.getSource();
		}
		else
		{
			Icon[] buttonIcons = new Icon[2];
			buttonIcons[BUTTON_SOURCE] = pressedButton.getIcon();
			buttonIcons[BUTTON_DESTINATE] = ((JButton)e.getSource()).getIcon();
			
			pressedButton.setIcon(buttonIcons[BUTTON_DESTINATE]);
			((JButton)e.getSource()).setIcon(buttonIcons[BUTTON_SOURCE]);
			
			pressedButton = null;
		}
	}
}
```

splitImage() teilt das Originalbild in 9 Teile auf, setFrame() generiert die Buttons und der ActionListener kümmert sich um die Interaktion.


----------



## deddy (11. Januar 2010)

ich bekomme diese Ergebnis.. 
wie sieht das Programm bei dir aus?


----------



## Kai008 (11. Januar 2010)

Du hast das Bild im falschen Ordner. Bei Eclipse wäre das der Ordner des Projektes, also der in dem auch standartgemäß der Ordner scr und bin ist. Wies bei anderen Umgebungen ist weiß ich nicht, gibt warscheinlich aber eh keinen Unterschied.


----------



## deddy (11. Januar 2010)

ich habe das Bild auch in dem src als auch in dem Package BildWechsel, aber trotzdem nur schwarzes Bild... 
meine Umgebung ist auch Eclipse, normaleweise geht es so, wenn ich das Bild im Package habe.


----------



## Kai008 (11. Januar 2010)

Warscheinlich, weil du mit getClass().getResource(String) über die URL lädst, aber in dem Fall muss es in ...\Workspace\Projectordner\image.png liegen. Du kannst aber natürlich auch in Zeile 38 die Ladeart oder den Pfad ändern, solange in der Variable originalIcon am Ende das Bild steht.


----------



## deddy (11. Januar 2010)

es gehts... ich weisse nicht warum.

Das Spiel ist ähnlich wie ich vorstelle, aber es sollte nur von dem linken klickt und rechten klickt oder von dem rechten klickt und linken klickt, die Bilder vertauscht werden können. In dem BildWechsel.jar ist es erlaubt, 2 mal Klickt vom linken klickt oder 2 mal Klick von rechten klickt, um die Bilder zu vertauschen.

ich gucke mir den Code an, die Bilder müssen noch durcheinander/randomize gemacht.  so dass die Aufgabe von dem Spiel besteht.
.., danach eine Finishmeldung muss noch geben, wenn die Bilder aufgeräumt werden.

Schon wäre mein Leben gerettet..


----------



## Kai008 (11. Januar 2010)

Dafür habe ich die beiden JPanels als Klassenvariable abgespeichert. Du kannst mit getComponents(), einer Schleife, und eventuell noch instanceof herausfinden, auf welchen JPanel der Source- oder Destinatebutton steht und das einfach vergleichen.

Um festzustellen, ob sie geordnet sind, könntest du z. B. die JButtons überschreiben, ihnen beim erzeugen ein byte als ID übergeben (z. B. die Schleifenvariable 'b'), und dann die Schleife durchgehen und jeweils prüfen, die Icons der JButton's die selben in den Klassen-Array sind. Damit sind die Icons der Buttons logischer weiße in der selben Reihenfolge, wie die nacheinander erstellten Einzelteile. Ginge aber auch per HashMap, wenn du ständig neue Werte mit der Position verknüpfst, und entfernst, beim überschreiben wäre der obere Tip natürlich hinfällig, weil du einfach die ID des Panel's in den 2 Schleifen im Construktor weitergeben kannst.

Zum mixen der Bilder würde ich zuerst je Panel eine Schattenkopie des Icon-Arrays erstellen lassen, ein Zufallsfeld des Arrays mit Math.random * x aussuchen, und in einer do so lange durchrennen, bis das Feld != null ist. Danach das Feld als Icon an den Button weitergeben und es in der Kopie auf null setzen.

Denke sollte alles so klappen, baust du jetzt mit ausführbaren Code-Beispiel sicher einfach ein, und am Ende überblickst du den Code sowieso komplett.


----------



## deddy (11. Januar 2010)

warum kann ich die Panel nicht vergroßern..?
ich möchte das 480x480 Bild in dem Panel setzen..


----------



## Kai008 (11. Januar 2010)

Wo ist das Problem?

Zeile 56:
frame.setSize(1020, 530);

Zeile 63:
buttonPanels[EAST_BUTTON_PANEL].setBounds(0, 0, 500, 500);

Zeile 70:
button.setBounds(160 * x + 10, 160 * y + 10, 160, 160);

Zeile 83:
buttonPanels[WEST_BUTTON_PANEL].setBounds(510, 0, 500, 500);

Zeile 89:
button.setBounds(160 * x + 10, 160 * y + 10, 160, 160);

Aber wie in den Kommentaren erwähnt, du solltest besser LayoutManager verwenden. FlowLayout ordnet Komponenten, wenn der Platz reicht horenziontal nacheinander an, das Grid(Bag)Layout in einen 2D-Raster.
Das sichert auch die Kompatiblität zu anderen OSes, habe mal gelesen, dass das null-Layout auf anderen OSen anderst ausschaut als am Root. Verstehe ich zwar nicht, da es ja Pixelgenau ist, aber würde kein Risiko eingehen.


----------



## deddy (11. Januar 2010)

ich verstehe nicht, wie JPanel mit .getComponent() funktioniert
weil buttonPanels.getComponent nicht geht.

ich habe mich so vorgestellt, ich mache if Schleife bei 

<JAVA>
public void actionPerformed(ActionEvent e)
    {
        if(pressedButton == null)
        {
            pressedButton = (JButton)e.getSource();
        }
        else
        {
            Icon[] buttonIcons = new Icon[2];
            buttonIcons[BUTTON_SOURCE] = pressedButton.getIcon();
            buttonIcons[BUTTON_DESTINATE] = ((JButton)e.getSource()).getIcon();


           if (pressedButton.getComponent(WEST_BUTTON_PANEL) == ((JButton).getComponent(WEST_BUTTON_PANEL))){
            	pressedButton = null;
                system.out.println("nur klickt von panel1 und panel2");
            }
            pressedButton.setIcon(buttonIcons[BUTTON_DESTINATE]);
            ((JButton)e.getSource()).setIcon(buttonIcons[BUTTON_SOURCE]);

            pressedButton = null;
        }
    }

</JAVA>

die code geht nicht, das liegt daran, dass pressedButton zwar JButton ist, aber (JButton) keine JButton ist...


----------



## Kai008 (11. Januar 2010)

Nein, weil du das JPanel nicht zum JButton hinzugefügt wurde.
Ergäbe imho auch kaum Sinn.

buttonPanels ist ein Array, du musst es um auf das jeweilige Feld zuzugreifen den "Pfad" durch die "Array-Tabelle" bis zu dem endgültigen Feld wo die Referenz drinnensteht angeben. buttonPanel*s*[WEST_BUTTON_PANEL].getComponents() <- s = Mehrzahl.


----------

