# Bilder auf Buttons per Klick tauschen ( Puzzle )



## HansK (8. Jun 2011)

Hallo,
Ich bräuchte Codingansätze um Bilder, welche auf Buttons liegen, zu tauschen!
Man sollte auf den einen Button klicken, dann auf einen zweiten, und somit die Bilder getauscht bekommen. Habe schon alles probiert aber ich bekomme es einfach nicht hin.
Das ganze soll ein Puzzlespiel werden.

MfG,
Hans


----------



## XHelp (8. Jun 2011)

http://www.java-forum.org/awt-swing-swt/119320-bilder-per-klick-tauschen.html
und http://www.java-forum.org/awt-swing-swt/118363-bild-buttons-per-klick-vertauschen.html
reichen nicht? Oder was ist jetzt neu an dem Problem?


----------



## HansK (8. Jun 2011)

Dort wurde die Frage leider nicht so gut beantwortet das ich es irgendwie lösen konnte.
Ich bin ein Anfänger und bräuchte da schon Coding Beispiele.

Gruß,
Hans


----------



## XHelp (8. Jun 2011)

Wir wurde in jedem Thread eine Frage gestellt, du hast dich aber gar nicht mehr geäußert. Wie soll man dir da denn helfen? :bahnhof: Alle paar Tage das selbe Thema aufmachen ohne Rückmeldung ist keine Lösung.


----------



## Michael... (8. Jun 2011)

Hier mal ein Ansatz zum Icontausch. Wobei Du mit der Vorgehensweise (s. m. Kommentar in einem der anderen Posts) vermutlich nicht glücklich wirst.

```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class ButtoIconSwap extends JFrame implements ActionListener {
	private int index;
	private JButton[] button;
	private JLabel label;
	
	public ButtoIconSwap() {
		index = -1;
		JPanel panel = new JPanel(new GridLayout(1,3));
		button = new JButton[3];
		for (int i=0; i<button.length; i++) {
			button[i] = new JButton();
			button[i].addActionListener(this);
			//button[i].setIcon(.......);
			panel.add(button[i]);
		}
		this.getContentPane().add(panel, BorderLayout.CENTER);
		this.getContentPane().add(label = new JLabel(" Ersten Button selektieren! "), BorderLayout.SOUTH);
	}
	
	public void actionPerformed(ActionEvent e) {
		int curIndex = -1;
		for (int i=0; i<button.length; i++) {
			if (e.getSource().equals(button[i])) {
				curIndex = i;
				break;
			}
		}
		if(index==-1) {
			index = curIndex;
			label.setText(" Zweiten Button selektieren! ");
		}
		else {
			swapIcons(index, curIndex);
			index = -1;
			label.setText(" Ersten Button selektieren! ");
		}
	}
	
	private void swapIcons(int index1, int index2) {
		Icon icon = button[index1].getIcon();
		button[index1].setIcon(button[index2].getIcon());
		button[index2].setIcon(icon);
	}

	public static void main(String[] args) {
		JFrame frame = new ButtoIconSwap();
		frame.setBounds(0, 0, 400, 200);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## HansK (8. Jun 2011)

Jetzt muss ich erstmal kniffeln wie ich das in mein Programm reinbekomme.
Ich kann ja mal mein bisheriges Coding zeigen.


```
import java.lang.String;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.*;
import java.applet.Applet;
import javax.swing.JFrame;
import java.awt.Container;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.io.*;

public class MenuExample extends JFrame {


  public MenuExample() {
    super("GAME");   // Fenstertitel an JFrame(String) übergeben
      setDefaultCloseOperation( EXIT_ON_CLOSE); // Fenster schließen = Ende
      
    Container contentPane = getContentPane();
    contentPane.setLayout( new GridLayout(3,3));  // Gridlayout 3x3 erzeugen

  final JButton[] arrayMitButtons = new JButton[10];
              for (int i = 1; i < arrayMitButtons.length; i++) {
              String index = String.valueOf(i);
              ImageIcon image = new
              ImageIcon("C:\\berg" +
              index + index + ".jpg");
              arrayMitButtons[i] = new JButton(image);
              //add(arrayMitButtons[i]);
              //arrayMitButtons[i].setVisible(false);
              }
//              JButton[] arrayCopy = new JButton[10];
//              for (int i = 1; i < arrayCopy.length; i++) {
//                arrayCopy[i] = arrayMitButtons[i];
//              }
//              System.out.println(arrayCopy[1].equals(arrayMitButtons[2]));


              for(int i = 1; i < arrayMitButtons.length; i++){
                JButton tmp = arrayMitButtons[i];
                int zelle = (int) (Math.random()*(arrayMitButtons.length - i) + i);
                arrayMitButtons[i] = arrayMitButtons[zelle];
                arrayMitButtons[zelle] = tmp;
                //System.out.println(i + "; " + zelle);

              }
              for(int i = 1; i <  arrayMitButtons.length; i++         ){
                add(arrayMitButtons[i]);
                arrayMitButtons[i].setVisible(false);
              }



    JMenu menu, submenu;
    JMenuItem menuItem;
    JMenuBar menuBar = new JMenuBar();

    menu = new JMenu( "GAME");          // Erzeugen eines Hauptmenüpunktes
    menuBar.add( menu);                       // Hinzufügen des Hauptmenüpunktes
    menuItem = new JMenuItem( "New Game"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);

    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
              for (int i = 1; i < arrayMitButtons.length; i++) {
              arrayMitButtons[i].setVisible(true);
              }
      }
    });

    
   /*  menuItem = new JMenuItem( "Bild 1");      // Erzeugen eines Untermenüs von New Game
    submenu.add( menuItem);                   // Untermenü wird dem Submenü hinzugefügt
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
              for (int i = 1; i < arrayMitButtons.length; i++) {
              arrayMitButtons[i].setVisible(true);
              }
      }
    });
    menuItem = new JMenuItem( "Bild 2");      // Erzeugen eines Untermenüs von New Game
    submenu.add( menuItem);                   // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Bild 3");      // Erzeugen eines Untermenüs von New Game
    submenu.add( menuItem);                   // Untermenü wird dem Submenü hinzugefügt


    menuItem = new JMenuItem( "Reset"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);

    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
              for (int i = 1; i < arrayMitButtons.length; i++) {
              arrayMitButtons[i].setVisible(false);
              }


      }
    });
    */
                                                       // Untermenü wird dem Hauptmenü hinzugefügt
    menuItem = new JMenuItem( "Exit");                    // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);                                   // Untermenü wird dem Hauptmenü hinzugefügt
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        System.exit(0);                                      // Durch wählen des Menupunketes "Exit" wird das Fenster beendet
      }
    });

    menu = new JMenu( "Optionen");           // Erzeugen eines Hauptmenüpunktes
    menuBar.add( menu);                        // Hinzufügen des Hauptmenüpunktes
    
   /* submenu = new JMenu( "Schwierigkeit");   // Erzeugen eines Sub-  bzw Untermenüs von Optionen
    menu.add( submenu);                      // Hinzufügen des Submenüpunktes
    menuItem = new JMenuItem( "Leicht");     // Erzeugen eines Untermenüs von Schwierigkeit
    submenu.add( menuItem);                  // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Mittel");     // Erzeugen eines Untermenüs von Schwierigkeit
    submenu.add( menuItem);                  // Untermenü wird dem Submenü hinzugefügt
    menuItem = new JMenuItem( "Schwer");     // Erzeugen eines Untermenüs von Schwierigkeit
    submenu.add( menuItem);                  // Untermenü wird dem Submenü hinzugefügt
    */
    
    menuItem = new JMenuItem( "Hilfe");
    menu.add(menuItem);
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        try
        {
        Desktop.getDesktop().open(new File("Hilfe.txt"));
        }
        catch(Exception eref)
        {
        }
      }
    });
    menuItem = new JMenuItem( "Handbuch"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
        try
        {
        Desktop.getDesktop().open(new File("Handbuch.pdf"));
        }
        catch(Exception eref)
        {
        }
      }
    });
    menuItem = new JMenuItem( "About"); // Erzeugen eines Untermenüs von Puzzle Pro
    menu.add(menuItem);
    menuItem.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e) {
             JOptionPane.showMessageDialog(null, "                                        ", "About", JOptionPane.CLOSED_OPTION);
      }
    });
    
    setJMenuBar( menuBar);                  // Erzeugen der kompletten Menüleiste
    setSize( 800, 600);                     // Größe der Menüleiste festlegen
    setResizable ( false ); // Fenster ist nicht veränderbar
  }



  public static void main( String[] args) {
    new MenuExample().setVisible( true);    // main() endet, Programm läuft weiter
  }
}
```

Könnte ich Teile von deinem Coding schon einbinden?


----------



## HansK (8. Jun 2011)

Noch eine Frage,

wie könnte ich denn das Coding schreiben das die Bilder direkt aus meinem Codingordner genommen werden und ich nicht den Pfad angeben muss? Kenne das nämlich nur so aber anders wäre es ja praktisch wenn jemand das Programm auf einem anderen Rechner starten will.

Gruß,
Hans


----------



## Michael... (8. Jun 2011)

Kommt darauf an, wie Du Dein Projekt organisierst. ImageIO.read(...) kann auch mit relativen Pfaden umgehen.
Ich lade Bilder grundsätzlich über 
	
	
	
	





```
getClass().getResource("...")
```
 da ich Applikation eigentlich immer als jar verteile und notwendige Bilder/Icons mit hineinpacke.


----------



## HansK (8. Jun 2011)

Ok das hat schonmal geklappt,
ich muss mich jetzt mal ans Button tauschen machen.

MfG,
Hans


----------

