Nie-kwadratowy JComponent

0

Od kilku dni borykam sie z takim problemem.
Pisze edytor UML w javie i nie moge sobie poradzisz z liniami (strzalkami laczacymi klasy). Tworze clase UMLLinia ktora dziedziczy po JComponent. W metodzie paint() rysuje na Graphics linie g.drawLine(x,y,x,y). I teraz pojawia sie problem. MouseListener dziala na calym Graphics (prostokacie opisujacym linie) a nie na samej lini. Mozna to jakos zmienic? Tak zeby najechanie strikte na linie powodowalo wywolanie funkcji mouseEntered() a nie na calym boundingBox'ie.

Z gory dziekuje za pomoc.
Pozdrawiam,
Kornel

0

a ja bym zrobil tak
w MouseMotionListener masz metode mouseMoved(MouseEvent e)
gdzie jest mysz mozesz sprawdzic e.getPoint();
i teraz
mamy klase Strzalka, a w niej metody

void paintComponent(Graphics g)
boolean contains(Point2D p);

wszystko co musisz zrobic to:

if(mojaStrzalka.contains(e.getPoint()){
//zmiana kursora
}

pozdrawiam

0

a ja bym zrobil tak
w MouseMotionListener masz metode mouseMoved(MouseEvent e)
gdzie jest mysz mozesz sprawdzic e.getPoint();
i teraz
mamy klase Strzalka, a w niej metody

void paintComponent(Graphics g)
boolean contains(Point2D p);

wszystko co musisz zrobic to:

if(mojaStrzalka.contains(e.getPoint()){
//zmiana kursora
}

pozdrawiam

0

Dzieki. Tez tak kombinowalem :-)
Rozwiazanie okazalo sie duzo latwiejsze. Wystarczylo sie zainteresowac metoda public boolean contains(int x, int y) z klasy java.awt.Component. Trzeba ja przeciazyc i przy pomocy ksztaltu (u mnie GeneralPath) pokazac ktory punkt nalezy do komponentu a ktory nie.

Jakby ktos kiedys mial podobny problem wklejam wycinek kalasy realizujacej komponent linii:

        (...)
	private GeneralPath path = new GeneralPath();
        (...) //to ona mowi awt ktora czesc Graphics uwazac za komponent a ktorej nie
	public boolean contains(int x, int y) 
	{
	    return path.contains(x, y);
	}
        private void recalculatePath() 
	{
		path.reset();
		path.moveTo(_x1-3, _y1-3);
		path.lineTo(_x2+3, _y2-3);
		path.lineTo(_x2+3, _y2+3);
		path.lineTo(_x1-3, _y1+3);
		path.lineTo(_x1-3, _y1-3);
		path.closePath();
	}

Pozdrawiam,

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