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, botów: 0