Reset del contenuto di un JPanel

di il
4 risposte

Reset del contenuto di un JPanel

Ciao. Ho questa struttura:

JFrame con 2 JPanel. Un JPanel è personalizzato e contiene un labirinto. L'altro JPanel contiene
dei bottoni, tra cui uno il cui scopo è quello di generare un nuovo labirinto.
E' possibile muoversi all'interno del labirinto tramite i tasti w,a,s,d. Per ora per generare
un nuovo labirinto ho fatto così:

Nel JFrame:

public void actionPerformed(ActionEvent e) {
		if(e.getSource().equals(generate)) {
			mazePanel.reset();
		}
Nel JPanel:

public void reset() {
		m = new Maze(DIM);
		repaint();
	}
Il labirinto viene correttamente ridisegnato ma non c'è più risposta agli eventi. Come posso risolvere? Grazie per qualsiasi tipo di aiuto.

4 Risposte

  • Re: Reset del contenuto di un JPanel

    Loris89 ha scritto:


    Il labirinto viene correttamente ridisegnato ma non c'è più risposta agli eventi. Come posso risolvere?
    Immagino che gli eventi per i tasti w,a,s,d li hai intercettati a livello di un KeyListener registrato sul tuo pannello. Il pannello però deve essere "focusable" (non lo è di default) e affinché gli eventi arrivino davvero il pannello deve ovviamente avere il "focus".

    Se clicchi su altro per azzerare, il pannello perde il focus .... quindi si tratta solo di ridare il focus al pannello. Altrimenti non saprei dire, non vedendo il codice.
  • Re: Reset del contenuto di un JPanel

    Beh ci ho provato ma non cambia nulla.

    Questo è il JPanel che mostra il labirinto:
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class MazePanel extends JPanel implements ActionListener {
    	
    	private static final long serialVersionUID = 1L;
    	private final int DIM = 41;
    	private Timer timer;
    	private Maze m;
    	private Player p;
    
    	public MazePanel() {
    		m = new Maze(DIM);
    		p = new Player();
    		setPreferredSize(new Dimension(DIM*15,DIM*15));
    		addKeyListener(new Al());
    		setFocusable(true);
    		timer = new Timer(25, this);
    		timer.start();
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent event) {
    		if(m.getMap(p.getTileX(), p.getTileY())==2) {
    			JOptionPane.showMessageDialog(null,"HAI VINTO!");
    			System.exit(0);
    		}
    		repaint();
    	}
    	
    	public void paint(Graphics g) {
    		super.paint(g);
    
    		for (int y = 0; y < DIM; y++) {
    			for (int x = 0; x < DIM; x++) {
    				if (m.getMap(x, y) == 0) {
    					g.drawImage(m.getGrass(), x * 15, y * 15, null);
    				}
    				if (m.getMap(x, y) == 1) {
    					g.drawImage(m.getWall(), x * 15, y * 15, null);
    				}
    				if (m.getMap(x, y) == 2) {
    					g.drawImage(m.getFinish(), x * 15, y * 15, null);
    				}
    			}
    		}
    		g.drawImage(p.getPlayer(), p.getTileX() * 15, p.getTileY() * 15, null);
    	}
    	
    	class Al extends KeyAdapter {
    		
    		public void keyPressed(KeyEvent e) {
    			
    			int keycode = e.getKeyCode();
    			
    			if(keycode == KeyEvent.VK_W) {
    				if(m.getMap(p.getTileX(), p.getTileY()-1) != 1) {
    					p.move(0, -1);
    				}
    			}
    			if(keycode == KeyEvent.VK_S) {
    				if(m.getMap(p.getTileX(), p.getTileY()+1) != 1) {
    					p.move(0, 1);
    				}
    			}
    			if(keycode == KeyEvent.VK_A) {
    				if(m.getMap(p.getTileX()-1, p.getTileY()) != 1) {
    					p.move(-1, 0);
    				}
    			}
    			if(keycode == KeyEvent.VK_D) {
    				if(m.getMap(p.getTileX()+1, p.getTileY()) != 1) {
    					p.move(1, 0);
    				}
    			}
    		}
    		
    		public void keyReleased(KeyEvent e) {
    			
    		}
    		
    		public void keyTyped(KeyEvent e) {
    			
    		}
    	}
    	
    	public void reset() {
    		
    	}
    }
    
  • Re: Reset del contenuto di un JPanel

    Loris89 ha scritto:


    Beh ci ho provato ma non cambia nulla.
    Nel codice che hai postato però non si vede nulla che dia il focus esplicitamente al pannello (setFocusable(true) non dà il focus .... fa solo sì che può avere il focus).

    Nel reset() metti:
    requestFocusInWindow();
  • Re: Reset del contenuto di un JPanel

    Era così semplice? .-. Ora funziona grazie..
Devi accedere o registrarti per scrivere nel forum
4 risposte