obiekt Graphics2D + obsługa zdarzeń

0

Witam wszystkich!

Jestem na początku przygody z Javą i piszę sobie programik w ramach nauki. Oczywiste jest że napotkałem problem:) Na czym on polega poniżej:

Chciałbym np na Jpanelu wyrysować figurę np linię i chciałbym też aby po najechaniu na nią kursorem myszy obsługiwane były zdarzenia myszy(np mousemove,mouseclicked itd). Problem mam z tym jak zrobić taką obsługę zdarzeń myszy dla obiektu Grapgics2D bo do tego obiektu nie można tak normalnie przypisać słuchacza. Takie coś występuje choćby w Wordzie, dodajemy linię, potem możemy nią manipulować, jest menu kontekstowe itp.

Pozdrawiam

0

piszesz klase, dziedziczysz po JPanel, przeslaniasz metode paintComponent, rysujesz figure (najlepiej aby bylo to pole klasy np. Rectangle2D kwadrat) dodajesz mouseListener (lub mouseMotionListener), sprawdzasz pozycje myszy (e.getX(), e.getY())
jesli Twoj (kwadrat.contains(x,y) && e.getButton==2) -> generuj event

pozdrawiam

0

Fajna metoda contains, na pewno sie przyda. Czyli jak bede mial wiele takich obiektow to trzeba by za kazdym ruchem kursora przeleciec cala liste tych obiektow i sprawdzic czy kursor miesci sie w polu ktorejs figury.......boje sie ze to bedzie bardzo pracochlonne dla aplikacji!

0

Przecież nie będziesz sprawdzał cały czas, tylko dla zdarzenia mausePressed() jesli klikniejsz na obiekt który chcesz przenies

public void mousePressed(MouseEvent e){
if(rect.contains(e.getX(), e.getY())) 
updateLocation(e);
}
0

Niby tak ale fajnie jest zrobić tak że jak najade na element to kursor sie zmienia w łapkę i sygnalizuję że mogę to złapać przenieść itp... a to wymaga ciągłego sprawdzania...

Mozna by to jakoś tak zrobic że timer by sprawdzał raz na 500 milisekund, efekt bylby taki ze po najechaniu kursorem na obiekt dopiero po chwili pokazują się np uchwyty do przenoszenia obiektu....i to by bylo wtedy sprawdzane 2 razy na sekunde a nie za kazdym ruchem myszy...mysle ze bylo by to duzo oszczedniejsze...

0

Zawsze uchwyt może się zmieniąć jak naciśniesz przycisk myszki i też sugeruje że możesz przenieś ;)

0

zdziwilbys sie, ale wbrew pozorom mozna rowniez sprawdzac liste obiektow w evencie mouseMoved (choc jak mowil kolega lepiej byloby po kliknieciu, no ale jak ktos chce miec bajerki) i wcale nie jest to takie wolne
natomiast 3 rzeczy:

  • uwazaj, mo metody mousePressed i MouseClicked wywolywane sa przy kliknieciu obie, i nie wiadomo, ktora wywola sie najpierw (sporo mi czasu zajelo znalezienie bledu)
  • utworz sobie (jesli masz wiele obiektow na ArrayList - Linked nie uzywaj - poczytaj o dostepie metoda get()) pole klasy np current, i jesli znajdziesz na liscie odpowiedni obiekt to przypisuj go do current a jak nie, to null (potem przy przenoszeniu sprawdzasz tylko czy current !=null)
  • jesli chcesz aby bylo szybciej - poczytaj o SWT

pozdr

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