2010-06-20 30 views
6

Basit bir bulmaca oyunum var. 16 fayanstan oluşan bir görüntü var (rastgele yerleştirilmiş). Görüntüler bir dizide saklanır ve oyun başlatıldığında ana JPanel'e eklenir.Bulmacada JPanel oyunu güncellenmiyor

alt text http://img248.imageshack.us/img248/7403/27632947.gif

Oyun bu şekilde çalışır: Her görüntü atributes 'yer' ve 'numara' vardır. 'Yer', ızgaradaki geçerli yer (doğru ya da değil) ve görüntü için istenen yer 'sayı' dır. Bir kullanıcı resmi tıkladığında "yer" ve "sayı" özellikleri kontrol edilir. Eğer uyuşmazsa hiçbir şey olmaz. Eğer oyun değilse, şu anda hafızada herhangi bir görüntü olup olmadığını kontrol eder. Hiçbiri yoksa, bu görüntünün 'yer' ve 'sayı' depolanır. Bellekte bir görüntü varsa, o anda tıklanan görüntünün 'plac'i saklanan görüntünün' numarasıyla kontrol edilir. Eşleştiğinde - yerleri değiş tokuş edilir. Bu bölüm düzgün çalışıyor. Ama şimdi, güncel resimlerle JPanel'imde addComponent yöntemini arıyorum ve hiçbir şey olmuyor. Yeni resimler, eskilerin yerine JPanel'e eklenmemeli mi?

Paket Bonusu;

import javax.swing.*; 
import java.util.Random; 
import java.awt.event.*; 
import java.awt.*; 

class Puzzle extends JPanel implements ActionListener { 
    private int selected_nr=-1; 
    private int selected_pl=-1; 
    private boolean memory=false; 
    private static Img[] images; 

    public Puzzle(){ 
     JFrame f = new JFrame("Smile"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.setSize(252,252); 
     f.setVisible(true); 

     setLayout(new GridLayout(4, 4)); 
     images = new Img[16]; 
     int[] buttons = new int[16]; 

     for(int i=0; i<16; i++){ 
      buttons[i] = i; 
     } 

     int rand; 
     int temp; 
     Random random; 

     random = new Random(System.currentTimeMillis()); 
     for (int i = 0; i < buttons.length; i++) { 
      rand = (random.nextInt() & 0x7FFFFFFF) % buttons.length; 
      temp = buttons[i]; 
      buttons[i] = buttons[rand]; 
      buttons[rand] = temp; 
     } 

     for (int i = 0; i < 16; i++) { 
      images[i] = new Img(i, buttons[i]); 
     } 
     addComponents(images); 
    } 

    public void addComponents(Img[] im){ 
     this.removeAll(); 
     for(int i=0; i<16; i++){ 
      im[i].addActionListener(this); 
      im[i].setPreferredSize(new Dimension(53,53)); 
      add(im[i]); 
     } 
     this.validate(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     Img b = (Img)(e.getSource()); 
     int num = b.getNumber(); 
     int pl = b.getPlace(); 

     if(!(b.rightPlace())){ 
      if(memory){ 
       if(pl == selected_nr){ 
        images[pl].setPlace(selected_pl); 
        images[selected_pl].setPlace(selected_nr); 
        selected_nr = -1; 
        selected_pl = -1; 
        memory = false; 
        addComponents(images); 
       } 
       else{ 
        System.out.println("Try other image"); 
       } 
      } 
      else{ 
       memory = true; 
       selected_nr = num; 
       selected_pl = pl; 
      } 
     } 
     else{ 
      System.out.println("OK !"); 
     } 
    } 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Puzzle(); 
      } 
     }); 
    } 
} 

class Img extends JButton { 
    int number; 
    int place; 
    ImageIcon img; 

    public Img(int p, int n){ 
     number = n; 
     place = p; 
     img = new ImageIcon("u"+number+".jpg", BorderLayout.CENTER); 
     setIcon(img); 
    } 

    public boolean rightPlace(){ 
     boolean correct=false; 
     if(number == place){ 
      correct = true; 
     } 
     return correct; 
    } 
    public void setPlace(int i){ 
     place = i; 
    } 
    public int getNumber(){ 
     return number; 
    } 
    public int getPlace(){ 
     return place; 
    } 
} 

DÜZENLEME: hala şans cevapları kullanmak için kod değişti, ancak. addComponents() güncellenmiş görüntüleri [] alır ancak bunları tekrar doğrulamaz.

+0

enter image description here

() '' Rastgele yeni = rastgele Rasgele düşünün. – trashgod

+0

Tamam, hatayı aldım. Basitçe resimlerdeki yerleri [] değiştirmem gerekiyordu. Şimdi çalışıyor. – DevAno1

cevap

3

Bileşenleri değiştirdikten sonra, Swing bileşenini invalidate() veya revalidate() numaralı telefonu arayarak 'yenilemek' gerekir.

4

Bu bileşenlerden hiçbirini gerçekten çıkarmadan tüm bileşenlerinizi tekrar JPanel'e ekliyorsunuz. addComponents() yönteminizde ilk olarak removeAll()'u arardım. Yan etkileri vurgulamak için bu yöntemi yeniden adlandırmak isteyebilirsiniz, çünkü artık sadece bileşen ekleyemez. Belki de resetComponents() daha iyi olurdu.

10

Önceden görüntü dosyalarına güvenmek yerine, mevcut bir görüntüyü dilimleme ve sonuçta elde edilen parçaları karıştırmanın bir örneği. @Frederick ve @akf'ın faydalı (+1) önerilerini birleştirir.

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class ImageLabelPanel extends JPanel implements ActionListener { 

    private static final int N = 4; 
    private final List<JLabel> list = new ArrayList<JLabel>(); 
    private final Timer timer = new Timer(1000, this); 

    ImageLabelPanel() { 
     this.setLayout(new GridLayout(N, N)); 
     BufferedImage bi = null; 
     try { 
      bi = ImageIO.read(new File("image.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     for (int r = 0; r < N; r++) { 
      for (int c = 0; c < N; c++) { 
       int w = bi.getWidth()/N; 
       int h = bi.getHeight()/N; 
       BufferedImage b = bi.getSubimage(c * w, r * h, w, h); 
       list.add(new JLabel(new ImageIcon(b))); 
      } 
     } 
     createPane(); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setVisible(true); 
     timer.start(); 
    } 

    private void createPane() { 
     this.removeAll(); 
     for (JLabel label : list) add(label); 
     this.validate(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Collections.shuffle(list); 
     createPane(); 
    } 

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