Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Non riesco ad utilizzare un semplice KeyAdapter...

    Ciao a tutti. Sto cercando di creare un semplicissimo programma che in base ai tasti direzionali della tastiera, mi sposta il quadrato sulla finestra. Il problema è che il quadrato rimane sempre fermo...

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class Move extends JPanel
    {
    	private int xCoord = 60;
    	private int yCoord = 60;
    	
    	public Move()
    	{
    		addKeyListener
    		(
    			new KeyAdapter()
    			{
    				public void keyPressed(KeyEvent event)
    				{
    					if (event.getKeyCode() == 37)
    					{
    						xCoord--;
    					}
    					else if (event.getKeyCode() == 38)
    					{
    						yCoord--;
    					}
    					else if (event.getKeyCode() == 39)
    					{
    						xCoord++;
    					}
    					else if (event.getKeyCode() == 40)
    					{
    						yCoord++;
    					}
    					repaint();
    				}
    			}
    		);
    	}
    	
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		
    		g.fillRect(xCoord,yCoord,60,60);
    	}
    
    	public static void main(String[] args)
    	{
    		Move panel = new Move();
    		JFrame frame = new JFrame("Move");
    		frame.setSize(400,250);
    		frame.setLocationRelativeTo(null);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		frame.add(panel);
    		
    		frame.setVisible(true);
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Non riesco ad utilizzare un semplice KeyAdapter...

    Originariamente inviato da Dreamer89
    Il problema è che il quadrato rimane sempre fermo...
    Metti nella inizializzazione:

    panel.setFocusable(true);

    P.S. Invece di scrivere valori come 37, 38 ecc... per i codici dei tasti, usa le costanti VK_xxx in KeyEvent.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Non riesco ad utilizzare un semplice KeyAdapter...

    Originariamente inviato da andbin
    Perché JPanel non è per default "focusable".

    Metti nella inizializzazione:

    panel.setFocusable(true);

    P.S. Invece di scrivere valori come 37, 38 ecc... per i codici dei tasti, usa le costanti VK_xxx in KeyEvent.
    Grazie ora provo. Ma le costanti sarebbero VK_LEFT, VK_UP ecc...?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Non riesco ad utilizzare un semplice KeyAdapter...

    Originariamente inviato da Dreamer89
    Ma le costanti sarebbero VK_LEFT, VK_UP ecc...?
    Esatto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5

    Re: Re: Re: Re: Non riesco ad utilizzare un semplice KeyAdapter...

    Originariamente inviato da andbin
    Esatto.
    Grazie mille, sempre molto d'aiuto ^^ Avrei però un'ultima domanda... come faccio ad intercettare più tasti alla volta?? Ad esempio, se il quadrato voglio farlo spostare in diagonale verso l'alto e verso destra contemporaneamente, dovrei premere sia il tasto su sia il tasto destra. Ma così come ora funziona sempre e solo l'ultimo tasto premuto. Come posso fare per riconoscere entrambi i tasti, oppure anche più di 2 tasti?

  6. #6
    Approfitto della discussione per un'altra cosa... in questo programma ho usato nello stesso modo un MouseListener, però funziona lo stesso, senza che abbia dovuto impostare setFocusable()... perchè con questo funziona anche senza?? Mi sono perso qualcosa? o_O
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class PaintTable extends JPanel
    {
    	static JPanel topPanel = new JPanel();
    	static JButton annulla = new JButton("Annulla");
    	static JButton cancella = new JButton("Cancella");
    	static String[] colorNames = {"Nero","Blu","Verde","Giallo","Rosso","Bianco"};
    	static JComboBox colors = new JComboBox(colorNames);
    	static String[] typeNames = {"Linea retta","Rettangolo","Cerchio"};
    	static JComboBox types = new JComboBox(typeNames);
    	static JCheckBox rov = new JCheckBox("Figura piena");
    	private Color[] color = new Color[99999];
    	private Color[] colorList = {Color.BLACK,Color.BLUE,Color.GREEN,Color.YELLOW,Color.RED,Color.WHITE};
    	private Point[] points1 = new Point[99999];
    	private Point[] points2 = new Point[99999];
    	private Point pointT;
    	private Point pointT2;
    	private boolean start = false;
    	private int countP = 0;
    	private byte[] type = new byte[99999];
    	private boolean[] filled = new boolean[99999];
    	static JPanel bottomPanel = new JPanel();
    	static JLabel label = new JLabel("Cursore del mouse fuori dal pannello");
    	public PaintTable()
    	{
    		setBackground(Color.WHITE);
    		
    		for (int i=0;i<99999;i++)
    		{
    			filled[i] = false;
    		}
    		
    		annulla.addActionListener
    		(
    			new ActionListener()
    			{
    				public void actionPerformed(ActionEvent event)
    				{
    					countP--;
    					points1[countP].x = 0;
    					points1[countP].y = 0;
    					points2[countP].x = 0;
    					points2[countP].y = 0;
    					pointT.x = 0;
    					pointT.y = 0;
    					pointT2.x = 0;
    					pointT2.y = 0;
    					repaint();
    				}
    			}
    		);
    		
    		cancella.addActionListener
    		(
    			new ActionListener()
    			{
    				public void actionPerformed(ActionEvent event)
    				{
    					countP = 0;
    					pointT.x = 0;
    					pointT.y = 0;
    					pointT2.x = 0;
    					pointT2.y = 0;
    					for (int i=0;i<countP;i++)
    					{
    						points1[i].x = 0;
    						points1[i].y = 0;
    						points2[i].x = 0;
    						points2[i].y = 0;
    					}
    					repaint();
    				}
    			}
    		);
    		
    
    		
    		addMouseListener
    		(
    			new MouseAdapter()
    			{
    				public void mousePressed(MouseEvent event)
    				{
    					start = true;
    					points1[countP] = event.getPoint();
    					pointT = event.getPoint();
    				}
    				public void mouseReleased(MouseEvent event)
    				{
    					points2[countP] = event.getPoint();
    					repaint();
    					countP++;
    				}
    				public void mouseExited(MouseEvent event)
    				{
    					label.setText("Cursore del mouse fuori dal pannello");
    				}
    			}
    		);
    		
    		addMouseMotionListener
    		(
    			new MouseMotionAdapter()
    			{
    				public void mouseDragged(MouseEvent event)
    				{
    					points2[countP] = event.getPoint();
    					pointT2 = event.getPoint();
    					for (int i=0;i<colorNames.length;i++)
    					{
    						if (colors.getSelectedIndex() == i)
    						{
    							color[countP] = colorList[i];
    						}
    					}
    					repaint();
    				}
    				public void mouseMoved(MouseEvent event)
    				{
    					label.setText(""+event.getX()+","+event.getY());
    				}
    			}
    		);
    	}
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
    		if (types.getSelectedIndex() == 0)
    		{
    			type[countP] = 0;
    		}
    		else if (types.getSelectedIndex() == 1)
    		{
    			type[countP] = 1;
    		}
    		else
    		{
    			type[countP] = 2;
    		}
    		if (start)
    		{
    			g.setColor(color[countP]);
    			if (type[countP] == 0)
    			{
    				g.drawLine(pointT.x,pointT.y,pointT2.x,pointT2.y);
    			}
    			else if (type[countP] == 1)
    			{
    				g.drawRect(pointT.x,pointT.y,pointT2.x-pointT.x,pointT2.y-pointT.y);
    			}
    			else
    			{
    				g.drawOval(pointT.x,pointT.y,pointT2.x-pointT.x,pointT2.y-pointT.y);
    			}
    			filled[countP] = rov.isSelected() ? true : false;
    			for (int i=0;i<countP;i++)
    			{
    				g.setColor(color[i]);
    				if (type[i] == 0)
    				{
    					g.drawLine(points1[i].x,points1[i].y,points2[i].x,points2[i].y);
    				}
    				else if (type[i] == 1)
    				{
    					if (!filled[i])
    					{
    						g.drawRect(points1[i].x,points1[i].y,points2[i].x-points1[i].x,points2[i].y-points1[i].y);
    					}
    					else
    					{
    						g.fillRect(points1[i].x,points1[i].y,points2[i].x-points1[i].x,points2[i].y-points1[i].y);
    					}
    				}
    				else
    				{
    					if (!filled[i])
    					{
    						g.drawOval(points1[i].x,points1[i].y,points2[i].x-points1[i].x,points2[i].y-points1[i].y);
    					}
    					else
    					{
    						g.fillOval(points1[i].x,points1[i].y,points2[i].x-points1[i].x,points2[i].y-points1[i].y);
    					}
    				}
    			}
    		}
    	}
    	public static void main(String[] args)
    	{
    		JFrame frame = new JFrame("Paint");
    		frame.setSize(640,480);
    		frame.setLocationRelativeTo(null);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		PaintTable table = new PaintTable();
    		
    		topPanel.setLayout(new FlowLayout());
    		topPanel.add(annulla);
    		topPanel.add(cancella);
    		colors.setMaximumRowCount(4);
    		topPanel.add(colors);
    		topPanel.add(types);
    		topPanel.add(rov);
    		
    		frame.add(topPanel,BorderLayout.NORTH);
    		frame.add(table,BorderLayout.CENTER);
    		frame.add(label,BorderLayout.SOUTH);
    		
    		frame.setVisible(true);
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.