Nie-kwadratowy JComponent

Odpowiedz Nowy wątek
2007-01-12 11:50
KornelZ
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

Pozostało 580 znaków

2007-01-12 13:25
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

Pozostało 580 znaków

2007-01-12 14:02
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

Pozostało 580 znaków

2007-01-12 15:23
KornelZ
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,

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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