Wężyk z książki "Java Core podstawy"

0

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);}
			}
				
		}
	}
0

W Javie wielkość liter ma znaczenie

public void PaintComponent(Graphics g)
to inna metoda niż
public void paintComponent(Graphics g)

0

żal.pl nie umiesz nawet przepisać kodu...

import java.awt.Container;
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.JFrame;
import javax.swing.JPanel;

public class Zdarzenia {

    public static void main(String[] args) {
        RamkaSzkicu ramka = new RamkaSzkicu();
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ramka.setVisible(true);
    }
}

class RamkaSzkicu extends JFrame {
    private static final long serialVersionUID = 1L;

    public RamkaSzkicu() {
        setSize(500, 500);
        PanelSzkicu panel = new PanelSzkicu();
        Container powZawartosci = getContentPane();
        powZawartosci.add(panel);
    }
}

class PanelSzkicu extends JPanel {
    private static final long serialVersionUID = 1L;
    private Point2D ostatni;
    private final ArrayList<Line2D> linie;
    private static final int PREDKOSC_NORM = 1;
    private static final int PREDKOSC_SZYBKA = 5;

    public PanelSzkicu() {
        ostatni = new Point2D.Double(100, 100);
        linie = new ArrayList<Line2D>();
        UchwytKlawisza sluchacz = new UchwytKlawisza();
        addKeyListener(sluchacz);
    }

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

    public void add(int dx, int dy) {
        Point2D koniec = new Point2D.Double(ostatni.getX() + dx, ostatni.getY() + dy);
        Line2D linia = new Line2D.Double(ostatni, koniec);
        linie.add(linia);
        repaint();
        ostatni = koniec;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        for (int i = 0; i < linie.size(); i++) {
            g2.draw(linie.get(i));
        }
    }

    private class UchwytKlawisza implements KeyListener {
        @Override
        public void keyPressed(KeyEvent zdarzenie) {
            int kodKlawisza = zdarzenie.getKeyCode();

            int d;
            if (zdarzenie.isShiftDown()) {
                d = PREDKOSC_SZYBKA;
            } else {
                d = PREDKOSC_NORM;
            }
            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);
            }
        }

        @Override
        public void keyReleased(KeyEvent zdarzenie) {
        }

        @Override
        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 == 'd') {
                add(0, d);
            }
        }
    }
}
0

już zmieniłem, działa wszystko :)

ale swoją drogą to masakra. od teraz będę zwracał większą uwagę na wielkość liter. tylko dlaczego kompilator nie zgłosił błędu?

0

Bo to przecież nie jest błąd o_O Zrobiłeś po prostu nową metodę zamiast przesłonić starą. Jakbyś użył adnotacji @Override to by zgłosił problem...

0

no rzeczywiście, zapomniałem że to nowa metoda :P trzeba uważać z tym przeładowywaniem funkcji bo wystarczy źle wpisać nazwę i potem cięzko znaleźć błąd... szczególnie jak program jest obszerny.
jeszcze raz dzieki, mysle ze temat do usuniecia :P

0
  1. Tak jak wspomniał Shalom, używaj adnotacji @Override. W Javie 6 możesz dawać @Override także przy implementacji metod z interfejsów. W obu przypadkach używanie adnotacji @Override jest zalecane.
  2. Każde sensowne IDE powinno pokazywać jakoś, że metoda nadpisuje metodę z klasy bazowej, np NetBeans pokazuje zielone kółeczko z literą O obok nazwy metody (oraz zielone kółeczko z literą I w przypadku implementowania metody z interfejsu).
0

ok, od teraz bede stosował @Override, na pewno ułatwi mi to ogarniecie kodu :)

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