Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Игра запоминалка


Автор: kuzmiand 31.7.2012, 15:55
 Привет всем!!! Помогите пожалуйста советом, я новичёк в Java, никак не могу дойти, как в игре-запоминалке  реализовать сравнение картинок(ImageIcon) на двух последовательно нажатых  кнопках(JToggleButton) .
 Размещаю 16 кнопок на панели. Имеется 8 картинок ,размещаю их  в кнопки , чтобы картинки 2 раза повторялись.
К кнопкам добавляю слушатель событий addActionListener(new ButtonListener()).
Код

public class JFrameHra extends JFrame  {
    
    public JToggleButton [] jb = new JToggleButton [16];
    public ImageIcon [] img = new ImageIcon[8];
    
    JFrameHra(){
    super("Hra");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setJMenuBar(new JMenuBarHra());
    setLayout(new GridLayout(4,4));
     for (int i=0; i<8; i++){
        jb[i] = new JToggleButton (img [i]= new ImageIcon("img/img1.png") );
        jb[i].setSelectedIcon(img [i]= new ImageIcon("img/img"+i+".png"));
        jb[i].addActionListener(new ButtonListener(jb,img));
        add(jb[i]);
    }
     for (int i=0; i<8; i++){
        jb[i] = new JToggleButton (img [i]= new ImageIcon("img/img1.png") );
        jb[i].setSelectedIcon(img [i]= new ImageIcon("img/img"+i+".png"));
        jb[i].addActionListener(new ButtonListener(jb, img));
        add(jb[i]);
    }
//    Сдеалать форму не меняющей размер
    setResizable(false);
    setSize(550,550);
   
    setLocation(100, 100);
    setVisible(true);
    }
}


  Создаю класс  ButtonListener в нём реализую метод actionPerformed(ActionEvent e) в котором обрабатываю события и здесь ЗАГВОЗДКА ((((, не могу додумать как сравнивать картинки на двух последовательно нажатых кнопках, чтобы, если картинки одинаковые кнопки диактивировались.

Код

public class ButtonListener implements ActionListener {
    
     public JToggleButton [] jb ;
     public ImageIcon [] img;
     
       public ButtonListener(JToggleButton jb[], ImageIcon img[]) {
        this.jb = jb;
        this.img = img;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        JToggleButton b = (JToggleButton)e.getSource();
         }
     }


Автор: kuzmiand 5.8.2012, 11:03
Ребят, ну помогите пожалуйста!!!
Неужели надо делать на каждую кнопку отдельный слушатель событий???

Автор: dorogoyIV 5.8.2012, 13:04
Код

 private ImageIcon tmp_img = null;
  ...
 public void actionPerformed(ActionEvent e)
 {
  JToggleButton jtb = (JToggleButton)e.getSource();

  if(tmp_img == null)
  {
   tmp_img = (ImageIcon)jtb.getIcon();
  }
  else
  {
   ImageIcon icon = (ImageIcon)jtb.getIcon();

   if(tmp_img.getImage().equals(icon.getImage()))
   {
    System.out.println("OK");
   }
   tmp_img = null;
  }
 }

Автор: kuzmiand 7.8.2012, 21:50
Вопрос решён, спасибо "dorogoyIV"  smile , наталкнул на мысль  
Мой способ :
Код

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import static java.util.Collections.shuffle;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
/**
 *
 * @author Kuzminov
 */
public final class JPanel_1 extends JPanel implements ActionListener {
    
      
     public JToggleButton [] jb;
     public ArrayList <ImageIcon> im;
     private ImageIcon tmp_img ;
     private JToggleButton jtb1 ;
 ///////////////////////////////////////////////////////////   
    public JPanel_1(){
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK) );
        this.setLayout(new GridLayout(4,4));
        setPreferredSize(new Dimension(500,500)); 
        init();
        
    }
/////////////////////////////////////////////////////////////
    public void init(){
        jb = new JToggleButton [16];
        setArrayListImg();
        for (int i=0; i<jb.length; i++){
        jb[i] = new JToggleButton (new ImageIcon(("img/vopros.png")) );
        jb[i].setSelectedIcon(im.get(i));
        jb[i].addActionListener(this);
        jb[i].setBorder(BorderFactory.createLineBorder(Color.BLACK) );
        this.add(jb[i]);
        setOpaque(true);
        tmp_img = null;
        jtb1 = null;
        }
    }
 ////////////////////////////////////////////////////////////
    public void setArrayListImg() {
        im = new ArrayList <ImageIcon>();
        for (int i = 0; i < 2; i++) {
            for (int ii = 0; ii < 8; ii++) {
                im.add(new ImageIcon("img/img"+ii+".png"));
            }
        }
        shuffle(im);
     } 
    
  /////////////////////////////////////////////////////////////
       @Override
  public void actionPerformed(ActionEvent e) {
       JToggleButton jtb = (JToggleButton)e.getSource();
  
  if(tmp_img == null)
  {
   tmp_img = (ImageIcon)jtb.getSelectedIcon();
   jtb1 = jtb;
  }
  else
  {
   JToggleButton jtb2 = (JToggleButton)e.getSource();   
   ImageIcon icon = (ImageIcon)jtb.getSelectedIcon();
   if(tmp_img.getImage().equals(icon.getImage()))
   {
       if (jtb!= jtb1) {
         System.out.println("OK");
         jtb2.setEnabled(false);
         jtb1.setEnabled(false);   
       }
      
   }
   else{
          jtb2.setSelected(false);
          jtb1.setSelected(false);
      }
   tmp_img = null;
  } 
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)