Witam. jestem na etapie nauki zdarzeń w Swingu i mam problem. Napisałem a prawdę mówiąc przepisałem program który tworzy odcinki 1 lub 5 pikselowe po naciskaniu strzałkami lub wsad-em. taki jakby wężyk. problem w tym że u mnie wyświetla się jedynie puste okno... dlaczego? o to kod:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.awt.event.*;
public class zdarzenia
{
public static void main(String[] args)
{
RamkaSzkicu ramka = new RamkaSzkicu();
ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ramka.setVisible(true);
}
}
/*
* Ramka, która wyświetli panel, który wyświetla elementy szkicu
*/
class RamkaSzkicu extends JFrame
{
public RamkaSzkicu()
{
setSize(500,500);
PanelSzkicu panel = new PanelSzkicu();
Container powZawartosci = getContentPane();
powZawartosci.add(panel);
}
}
/*
* Panel, w którym będziemy szkicować
*/
class PanelSzkicu extends JPanel
{
public PanelSzkicu()
{
ostatni = new Point2D.Double(100, 100);
linie = new ArrayList<Line2D>();
UchwytKlawisza sluchacz = new UchwytKlawisza();
addKeyListener(sluchacz);
}
public boolean isFocusTraversable()
{
return true;
}
/*
* funkcja dodająca nową linię do szkicu
* @param dx przesunięcie poziome
* @param dy przesunięcie pionowe
*/
public void add(int dx, int dy)
{
// wyznacz nowy punkt końcowy
Point2D koniec = new Point2D.Double(ostatni.getX()+dx, ostatni.getY()+dy);
// dołącz nową linię
Line2D linia = new Line2D.Double(ostatni, koniec);
linie.add(linia);
repaint();
// zapamiętaj nowy punkt końcowy
ostatni = koniec;
}
public void PaintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
// narysuj wszystkie linie
for (int i=0; i<linie.size(); i++)
g2.draw(linie.get(i));
}
private Point2D ostatni;
private ArrayList<Line2D> linie;
private static final int PREDKOSC_NORM = 1;
private static final int PREDKOSC_SZYBKA = 5;
/*
* Klasa wewnętrzna obsługująca klawisze
*/
private class UchwytKlawisza implements KeyListener
{
public void keyPressed(KeyEvent zdarzenie)
{
int kodKlawisza = zdarzenie.getKeyCode();
// wyznacz dystans
int d;
if (zdarzenie.isShiftDown())
d = PREDKOSC_SZYBKA;
else
d = PREDKOSC_NORM;
//dołącz nową linię
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;
// wyznacz dystans
if (Character.isUpperCase(znakKlawisza))
d = PREDKOSC_SZYBKA;
else
d = PREDKOSC_NORM;
if (znakKlawisza == 'w') { add(0,d);}
else if (znakKlawisza == 'a') { add(-d,0);}
else if (znakKlawisza == 's') { add(0,-d);}
else if (znakKlawisza == 'w') { add(0,d);}
}
}
}