Graphics g, KeyListener poruszanie linia

0

Witam mam problem i nawet nie jeden, natrzaskalem cos takiego, ale niewiem woguel jak do tego sie zabrac, chodzi mi ocos takiego:
jest linia, sterujac klawiszami, przesuwam ja(cos ala waz tylko nic nie zbieram)
jak to zrobic?

import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
public class rysunek extends JFrame
{
	int a,b;
	public rysunek()
	{
		setSize(400,400);
		setTitle("Rysownik 1.1");
		JPanel panel=new JPanel();
		
		sterowanie klawisz=new sterowanie();
		addKeyListener(klawisz);
	
		//panel.add(klawisz);
		setContentPane(panel);
		
	}

	public void oblicz(int x, int y)
	{
		//g.drawLine(a,100,100,b);
		a=x;
		b=y;
		repaint();

	}
	
	public void paintComponent(Graphics g) 
	{
		super.paint(g);
		g.setColor(Color.red);
		g.drawLine(a,100,100,b);
		repaint();
	}
	
	private class sterowanie implements KeyListener
	{
		public void keyPressed(KeyEvent zdarzenie)
		{
			char klawisz=zdarzenie.getKeyChar();
			if(klawisz=='w')
			{
				JOptionPane.showMessageDialog(null,"asads");
				
				oblicz(0,-20);
				JOptionPane.showMessageDialog(null,"asads");
			}
			else if(klawisz=='a')
			{
				oblicz(-20,0);
			}
			else if(klawisz=='d')
			{
				oblicz(20,0);
			}
			else if(klawisz=='s')
			{
				oblicz(20,0);
			}
			repaint();
		}
		public void keyReleased(KeyEvent zdarzenie){
		}
		public void keyTyped(KeyEvent zdarzenie){
		}
		
	}
	
	public static void main(String argv[])
	{
		rysunek rys=new rysunek();
		rys.setVisible(true);
	}
}
0

Twój opis przed kodem jest niejasny - nie wiadomo o co Ci dokładnie chodzi. Na pierwszy rzut oka mam jedną uwagę - nie możesz w metodzie paint wywoływać metody repaint, gdyż metoda repaint w pośredni sposób wywołuje metodę paint.

0

chodzi mi wiec o cos takiego:
tworze okno 400x400 po uruchomieniu pojawia mi sie na srodku punkt(linia), teraz gdy wcisne "w" idzie(rysuje sie) do gory, gdy "a" to w lewo i caly czas widac droge jaka przebyla nasza linia, mam nadzieje ze dobrze to napisalem

0
  1. masz linie poczatkowa, w klasie masz zmienne x oraz y ktore zawieraja pkt startowy linii
  2. jesli wcisniesz w od wspolrzednej y odejmujesz ilestam (co ile ma sie ruszac)
    jesli s to dodajesz
    podobnie z a i d w przypadku x
    y robisz odwrotnnie niz na matematyce poniewaz w okienkach y rosna w dol
  3. po zmianie wspolrzednych mozesz zrobic repainta, i w metodze paint component mozesz zrobic malutka optymalizacje taka ze na poprzedniej linii rysujesz taka sama linie o kolorze tla (musisz wiec zapamietac poprzednie wspolrzedne) a pozniej nowa linie o nowych wspolrzednych

chyba wszystko

0

ok sprobuje sie z tym pomeczyc, bo jakos niekojarze jak to zrobic
tu kod z ksiazki(Java 2 Podstawy) chcialem napisac podobny tylko troszke innaczej.

/**
   @version 1.30 2000-06-03
   @author Cay Horstmann
*/

 import java.awt.*;
 import java.awt.geom.*;
 import java.util.*;
 import java.awt.event.*;
 import javax.swing.*;
 
 public class Szkic
 {  
    public static void main(String[] args)
    {  
       RamkaSzkicu ramka = new RamkaSzkicu();
       ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       ramka.show();
    }
 }
 
 /**
    Ramka, zawierająca panel, na którym będziemy szkicować
 */
 class RamkaSzkicu extends JFrame
 {
    public RamkaSzkicu()
    {
       setTitle("Szkic");
       setSize(SZEROKOSC, WYSOKOSC);
 
       // dołącz panel do ramki
 
       PanelSzkicu panel = new PanelSzkicu();
       Container powZawartosci = getContentPane();
       powZawartosci.add(panel);
    }
 
    public static final int SZEROKOSC = 300;
    public static final int WYSOKOSC = 200;  
 }
 
 /**
    Panel, na którym będziemy szkicować
 */
 class PanelSzkicu extends JPanel
 { 
    public PanelSzkicu()
    {  
       ostatni = new Point2D.Double(100, 100);
       linie = new ArrayList();
       UchwytKlawisza sluchacz = new UchwytKlawisza();
       addKeyListener(sluchacz);
    }
 
    public boolean isFocusTraversable()
    {  
       return true; // zezwala na aktywację panelu
    }
 
    /**
       Dodaje 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((Line2D)linie.get(i));
    }
 
    private Point2D ostatni;
    private ArrayList linie;
 
    private static final int PREDKOSC_NORMALNA = 1;
    private static final int PREDKOSC_ZWIEKSZONA = 5;
 
    private class UchwytKlawisza implements KeyListener
    {  
       public void keyPressed(KeyEvent zdarzenie)
       {  
          int kodKlawisza = zdarzenie.getKeyCode();
 
          // wyznacz dystans
          int d;
          if (zdarzenie.isShiftDown())
             d = PREDKOSC_ZWIEKSZONA;
          else
             d = PREDKOSC_NORMALNA;
 
          // 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();
 
          // wyznacz dystans
          int d;
          if (Character.isUpperCase(znakKlawisza))
          {  
             d = PREDKOSC_ZWIEKSZONA;
             znakKlawisza = Character.toLowerCase(znakKlawisza);
          }
          else
             d = PREDKOSC_NORMALNA;
 
          // dołącz nową linię
          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);
       }
    }
 }

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