Problem z KeyListener

0

Napisalem pewien program i nie wiedzic czmu nie chce działc.Program jest inspirowany z ksiazki Java 2 Podstawy. Ma on wyswietlac linie na ekranie po wcisniecu odpowiednich klawiszy porgram sie kompiluje ale nie nic nie wyswietla po na prawde dlugiej analizie nie wiem w czym jest problem ...Prosze o pomoc
A to to kod Programu

import javax.swing.JFrame;



public class Szkic {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RamkaSzkicu ramka=new RamkaSzkicu();
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ramka.setVisible(true);

	}

}
import java.awt.Container;

import javax.swing.JFrame;

public class RamkaSzkicu extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = -8989754551010027261L;
	public RamkaSzkicu(){
		setTitle(" szkic ");
		setSize(szer,wys);
		
		PanelSzkicu panel=new PanelSzkicu();
		Container powZawartosci=getContentPane();
		powZawartosci.add(panel);
		
	}
private static final int szer=+300;
private static final int wys=300;
}
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.JPanel;

public class PanelSzkicu extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 6075326502819407047L;

	public PanelSzkicu(){
		ostatni=new Point2D.Double(100,100);
		linie =new ArrayList();
		UchwytKlawisza szluchacz=new UchwytKlawisza();
		addKeyListener(szluchacz);
		
		
	}
	
	public boolean isFocusTravesable(){
		return true;
	}
	public void add(int dx, int dy){
		Point2D koniec=new Point2D.Double(ostatni.getX()+dx,
		ostatni.getY()+dy);
		System.out.println("cos sie dzije");
		Line2D linia =new Line2D.Double(ostatni,koniec);
		linie.add(linia);
		repaint();
		
		ostatni=koniec;
	}
	public void paintComponent(Graphics g){
		  super.paintComponent(g);
		Graphics2D g2=(Graphics2D)g;
		
		System.out.println(linie.size());
		for(int i=0;i<linie.size();i++){
			g2.draw((Line2D)linie.get(i));
			
		}
	}
	private Point2D ostatni;
	private ArrayList linie;
	
	private static final int predkoscNormalna=1;
	private static final int predkoscZwiekszona=5;

	private class UchwytKlawisza implements KeyListener{
		public void keyPressed(KeyEvent zdarzenie){
			int kodKlawisza=zdarzenie.getKeyCode();
			System.out.println(predkoscNormalna);
			int d;
			if (zdarzenie.isShiftDown())
				d=predkoscZwiekszona;
			else
				d=predkoscNormalna;
			
			if(kodKlawisza==KeyEvent.VK_LEFT){add(-d,0);}
			else if(kodKlawisza==KeyEvent.VK_RIGHT)add(d,0);
			else if (kodKlawisza==KeyEvent.VK_UP)add(0,-d);
			else if(kodKlawisza==KeyEvent.VK_DOWN)add(0, d);
		}
		public void keyReleased(KeyEvent zdarzenie){}
		
		public void keyTyped(KeyEvent zdarzenie){
			char znakKlawisza=zdarzenie.getKeyChar();
			
			int d;
			if(Character.isUpperCase(znakKlawisza)){
				d=predkoscZwiekszona;
				znakKlawisza=Character.toLowerCase(znakKlawisza);
			}else 
				d=predkoscNormalna;
			
			if(znakKlawisza=='h')add(-d,0);
			else if(znakKlawisza=='l')add(d,0);
			else if (znakKlawisza=='k')add(0,-d);
			else if(znakKlawisza=='j')add(0, d);
		}
	}
}
0

Zrobiłeś literówkę, powinno być tak

        public boolean isFocusTraversable(){
                return true;
        }

a właściwie tak (bo metoda isFocusTraversable() jest deprecated

        public boolean isFocusable(){
                return true;
        }
0

Serdecznie dziekuje za pomoc. Powiem ze nie spodziwalem sie za tam jest bład.
I w sumie takie pytanko co według was jest bardziej "eleganskie" takich kodaj jak ten moje, stosowanie klas wewnetrzynych tak jest ja to zroiblem czy wewnecznej klasy anonimowej??

0

Aby twój program działał konieczne było aby PanelSzkicu mogł mieć focus. Najbardziej naturalny sposób by to uzyskać, to troszkę zmienić konstruktor

        public PanelSzkicu(){
                ostatni=new Point2D.Double(100,100);
                linie =new ArrayList();
                UchwytKlawisza szluchacz=new UchwytKlawisza();
                addKeyListener(szluchacz);
                setFocusable(true);               
        }

Jeżeli w klasie potomnej nadpisujesz metodę (zwłaszcza taką, której jawnie nie wywołujesz) bezpiecznie jest użyć adnotacji

        @Override public boolean isFocusTravesable(){
                return true;
        }

wtedy kompilator poinformuje cię o literówce - dowiesz się że w klasie bazowej nie ma metody
isFocusTravesable().

0

Twoje sugestie były bardzo pomocne. Całkiem zapomonialem o czyms takim jak @Override a jest to bardzo pomocne ..

1 użytkowników online, w tym zalogowanych: 0, gości: 1