2016-11-24 1 views
0

Ich möchte das Symbol von 2 Jbuttons ändern, indem Sie eine und dann die nächste, um ihre Symbole zu tauschen. Etwas wie Candy Crush oder Bejeweled. Ich möchte Action-Listener verwenden, um dies zu erreichen, wie soll ich das machen? Tauschen Icons von 2 jbutton

ist dies die gui meines Programms:

public class UI implements Runnable { 

private JFrame _frame; 
private Model _model; 
private ArrayList<JButton> _tiles; 

public void run() { 
    _model = new Model(); 
    _frame = new JFrame(); 
    _frame.setLayout(new GridLayout(5,5)); 

    _tiles = new ArrayList<JButton>(); 
    for (int i=0; i<25; i++) { 
     JButton tile = new JButton(); 
     tile.setBackground(Color.white); 
    //this just pick out random icon file from a folder 
     tile.setIcon(_model.randomIcon()); 
     tile.addActionListener(new ButtonBorderHandler(_model,tile)); 
    //this is the actionlistener that i want to implement the swap on 
     tile.addActionListener(new ButtonSwapHandler(); 
     _tiles.add(tile); 
    } 

ich habe versucht, es zu tun, wie so

public class ButtonSwapHandler implements ActionListener{ 

JButton _button1; 
JButton _button2; 
Model _model; 
UI _ui; 

public ButtonSwapHandler(UI u,Model m, JButton b1, JButton b2){ 
    _model=m; 
    _button1=b1; 
    _button2=b2; 
    _ui =u; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 

//this line should give me the position of the first button i press 
    int i = _ui.getTiles().indexOf(e.getSource()); 

//this is the part where i dont know how to keep going 
//i want to know where is the 2nd button that i clicked 
    int j = _ui.getTiles().indexOf(e. 

// this is the method i wrote to make the swap 
// it just the Collections.swap(tile,positionOfButton1,postionOfButton2) 
    _model.swap(ui._tile,i,j); 
} 
+0

Haben Sie Ihren versucht repaint() oder() nach dem Austausch erneut validieren? – Definity

+0

Das Problem ist, dass ich nicht weiß, wie man auswechselt, weil ich nicht weiß, welche Taste gedrückt wird – john

Antwort

0

Ihre Logik wenig Klarheit braucht. Sie erstellen ein 5x5-Raster, in dem Sie die Schaltflächen ausfüllen.

Zum Beispiel wie folgt aus:

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19 
20 21 22 23 24 

Aber, wenn Sie auf eine Schaltfläche klicken, wie stellen Sie sicher die Richtung des Swap? Sprich, wenn der Benutzer auf die Schaltfläche 7 klickt, welche benachbarte Schaltfläche von 7 sollte zum Austauschen ausgewählt werden?

Also, das fehlende Stück Ihrer Logik ist die Richtung.

Zum Beispiel:

Wenn der Swap geschieht immer mit sofortiger linken Taste können Sie die Swap-Taste wie indexOf(selectedButton)-1 berechnen. Wiederum kann der Austausch nur bedingt stattfinden, wenn diese Reihe in diesem zweidimensionalen Gitter einen unmittelbaren linken Knopf hat.

Update:

Wenn die Aktion soll nur geschehen, nachdem zwei Schaltflächen klicken, dann müssen Sie eine weitere Klasse erstellen, die tatsächlich den Überblick über Anzahl der Tasten hält geklickt tauscht dann, wenn Zahl == 2.

Es folgt ein modifiziertes Beispiel:

public class ButtonClicksCounter { 
    static ArrayList<JButton> _buttonsClicked = new ArrayList<JButton>(); 
    public static void addButton(JButton btn) { 
     _buttonsClicked.add(btn); 
    } 

    public static int getButtonClicksCount() { 
     return _buttonsClicked.size(); 
    } 

    public static void clearButtonClicksCount() { 
     _buttonsClicked.clear(); 
    } 

    public ArrayList<JButton> getButtonsClicked() { 
     return _buttonsClicked; 
    } 

} 

public class ButtonSwapHandler implements ActionListener{ 


JButton _button; 
Model _model; 
UI _ui; 

public ButtonSwapHandler(UI u, Model m, JButton b1){ 
    _model=m; 
    _button=b1; 
    _ui =u; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    //Add the button 
    ButtonClicksCounter.addButton((JButton)e.getSource()); 

    //Check if count==2 
    if(ButtonClicksCounter.getButtonClicksCount()==2) { 
     ArrayList<JButton> buttonsToSwap = ButtonClicksCounter.getButtonsClicked(); 

     //Get positions 
     int i = _ui.getTiles().indexOf(buttonsToSwap[0]); 
     int j = _ui.getTiles().indexOf(buttonsToSwap[1]); 

     //Swap 
     _model.swap(ui._tile,i,j); 

     //Clear selection 
     ButtonClicksCounter.clearButtonClicksCount(); 
    } 

} 
+0

ich hatte gehofft, horizontal und vertikal zu tauschen. Mit Ihrem Beispiel von Button 7 weiß ich, dass ich mit indexOf (e.getSource) eine Aktion ausführen kann. aber, ich weiß nicht, wie man herausfindet, welche Tasten gedrückt wird – john

+0

danke! Das funktioniert – john