2012-02-27 2 views
0

Le problème:tableau perd des données lorsque l'interface graphique est cliqué

  • faire un tableau d'objets
  • dès que je clique sur l'interface graphique du tableau est réglé sur null
  • Je remonte le code et a vu que mon tableau est correctement configuré

Voici le code:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class Puzzle1 extends JPanel{ 
     public Square[] sq; 
     public String zero = "16"; 

    public class Square{ 
      public int realPos; 
      public int curPos; 
     } 

    public String setAdjacent(String curZero, int z){ 
     String adj = "-1"; 
     int zeroInt = Integer.parseInt(curZero); 
     if(z==0){ 
       adj = Integer.toString(zeroInt+1); 
       if(zeroInt+1 == 17 || zeroInt+1 == 13 || zeroInt+1 == 9 || zeroInt+1 == 5){ 
        adj = "-1"; 
       } 
      } 
      if(z==1){ 
       adj = Integer.toString(zeroInt-1); 
       if(zeroInt-1 == 0|| zeroInt-1 == 4 || zeroInt-1 == 8 || zeroInt-1 == 12){ 
        adj = "-1"; 
       } 
      } 
      if(z==2){ 
       adj = Integer.toString(zeroInt+4); 
       if(zeroInt+4 > 16){ 
        adj = "-1"; 
       } 
      } 
      if(z==3){ 
       adj = Integer.toString(zeroInt-4); 
       if(zeroInt-4 < 1){ 
        adj = "-1"; 
       } 
      } 

     return adj; 
    } 
    public static void buildGUI(){ 
     JFrame frame = new JFrame("Puzzle"); 
     Puzzle1 panel = new Puzzle1(); 
     GridLayout mainLayout = new GridLayout(1, 1); 
     panel.setPreferredSize(new Dimension(300, 300)); 
     panel.setMinimumSize(new Dimension(300, 300)); 
     panel.setMaximumSize(new Dimension(300, 300)); 
     frame.setResizable(false); 
     panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2)); 
     Puzzle1 p1 = new Puzzle1(); 
     panel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
     p1.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
     p1.setName("1"); 
     panel.setLayout(mainLayout);  
     p1.add(new JLabel("1")); 
     panel.add(p1); 
     frame.setContentPane(panel); 
     frame.setSize(300,300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //closes thread on close. 
     frame.setVisible(true); 
    } 

    public void clicked(JPanel pnlClick){ 
       String adj[] = new String[4]; 
      for(int z=0; z<4; z++){ 
       adj[z] = setAdjacent(zero, z); 
      } 
      String clicked = pnlClick.getName(); 
      for(int i = 0; i<4; i++){ 
       String stAdj = adj[i]; 
       System.out.println(stAdj); 
        int clkd = Integer.parseInt(clicked); 
       sq[clkd].curPos = 0; 
       System.out.println("clicked and adj"); 
      } 
    } 
    class MouseEventHandler implements MouseListener{  
     @Override 
     public void mouseClicked(MouseEvent e) { 
      JPanel pnlClick = (JPanel)(e.getSource()); 
      clicked(pnlClick); 
     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
      // TODO Auto-generated method stub 

     } 
     @Override 
     public void mouseExited(MouseEvent arg0) { 
     } 
     @Override 
     public void mousePressed(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseReleased(MouseEvent arg0) { 
     } 

    } 

    public Puzzle1() { 
     MouseEventHandler handler = new MouseEventHandler(); 
     this.addMouseListener(handler); 
    } 

    public void createSquares(){ 
     sq = new Square[16]; 
     for(int j = 0; j < 16; j++){ 
      sq[j] = new Square(); 
     } 
     for(int i = 0; i < 16; i++){ 
      if(i == 0){ 
       sq[i].realPos = 16; 
       sq[i].curPos = 0; 
      } 
      else{ 
       sq[i].realPos = i; 
       sq[i].curPos = i; 
      } 

     } 
    } 

    public static void main(String[] args){ 
     Puzzle1 Puzzle1 = new Puzzle1(); 
     Puzzle1.buildGUI(); 
     Puzzle1.createSquares(); 
    } 
} 

J'essaie de casser n'importe où la variable 'sq' pourrait être effacée une fois que je clique mais le débogueur va toujours directement à l'événement mouseClicked et le débogueur montre que 'sq' est nul.

+0

Le code que j'ai posté tout comme ne compilera pas. Mon code compile. –

+0

Veuillez clarifier - quand vous dites "ça va toujours" et "c'est nul", à quoi ces deux "ça" se réfèrent? – DNA

+0

Okay @AndrewThompson J'ai édité le code pour qu'il compile. Merci pour la suggestion SSCCE. –

Répondre

3

Appel createSquares dans votre constructeur Puzzle1 avant l'appel à addMouseListener

+0

Merci! Puis-je demander pourquoi cela fonctionne? –

+0

Je vais vous donner un indice. Vous créez 3 objets Puzzle1 différents mais appelez seulement createSquares() sur l'un d'entre eux. –

2

Essayez cette variante de la méthode clicked et examinez soigneusement la sortie.

public void clicked(JPanel pnlClick){ 
      String adj[] = new String[4]; 
     for(int z=0; z<4; z++){ 
      adj[z] = setAdjacent(zero, z); 
     } 
     String clicked = pnlClick.getName(); 
     System.out.println("Clicked name: " + clicked); 
     for(int i = 0; i<4; i++){ 
      String stAdj = adj[i]; 
      System.out.println(stAdj); 
      if(clicked.equals(stAdj)){ 
       int clkd = Integer.parseInt(clicked); 
       sq[clkd].curPos = 0; 
       System.out.println("clicked and adj"); 
      } 
     } 
} 
+0

Merci Andrew d'avoir porté cela à mon attention, c'était définitivement une erreur mais malheureusement, j'ai toujours le même problème après avoir réglé ce problème. Cette erreur ne se produisait pas avant mes tentatives pour résoudre le problème signalé. J'avais à l'origine Puzzle1 p1 = new Puzzle1(); et je l'ai changé en JPanel p1 = new JPanel(); En le modifiant, vous avez corrigé le problème que vous avez mentionné. Je vais mettre à jour le code. –

Questions connexes