Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[JAVA] Pobieranie nazwy obiektu

przemo_wielki 19 Cze 2010 17:24 2121 9
  • #1 19 Cze 2010 17:24
    przemo_wielki
    Poziom 23  

    Witam,

    tworzę prosty applet w którym rysuję 2 obiekty (kwadraty) typu Rectangle rect1, rect2;
    Teraz chciałbym wiedzieć na który obiekt klikam: czy to jest rect1 czy może rect2. Jak pobrać nazwę obiektu?
    Oczywiście wszystko w:

    Code:
        public void mouseClicked(MouseEvent e) {}

    0 9
  • Pomocny post
    #2 19 Cze 2010 20:04
    gaskoin
    Poziom 38  

    a mógłbyś pokazać więcej tego kodu ? Bo z tego co pokazałeś ciężko się domyślić co tam nabazgrałeś, a wróżek na forum brak

    0
  • #3 19 Cze 2010 22:04
    przemo_wielki
    Poziom 23  

    Code:
    import java.applet.Applet;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;

    public class NewApplet extends Applet implements MouseListener{
        Rectangle rect, rect2;


        @Override
        public void init() {
            setSize(600,500);
            rect = new Rectangle(0,0,100,100);
            rect2 = new Rectangle(200,200,100,100);
            addMouseListener(this);
        }

        @Override
        public void paint(Graphics g){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(Color.red);
            g2d.fill(rect);

            g.setColor(Color.BLACK);
            g2d.fill(rect2);
        }

        public void mouseClicked(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }
       
    }

    Program wydaje się banalny dlatego wcześniej nie wstawiłem kodu.

    0
  • #4 20 Cze 2010 00:52
    gaskoin
    Poziom 38  

    a chociażby można to zrobić tak:

    Code:
    public void mouseClicked(MouseEvent e) {
    
           int x = this.getMousePosition().x;
           int y = this.getMousePosition().y;
           if(x >= rect.getX() && x <= rect.getX() + rect.getWidth() && y >= rect.getY() && y <=rect.getY() + rect.getHeight()) System.out.println("kwadrat 1");
           if(x >= rect2.getX() && x <= rect2.getX() + rect2.getWidth() && y >= rect2.getY() && y <=rect2.getY() + rect2.getHeight()) System.out.println("kwadrat 2");
        }

    0
  • #5 20 Cze 2010 01:06
    przemo_wielki
    Poziom 23  

    Niestety to rozwiązanie mnie nie zadowala bo jak weźmiemy większą liczbę obiektów (docelowo 32) to co wtedy, przecież nie będę sprawdzał wszystkich przypadków (takiego rozwiązania nawet nie brałem pod uwagę)?

    Dzięki za odp.

    //this.getMousePosition().x "ładniej" zastąpić poprostu e.getX();

    0
  • Pomocny post
    #6 20 Cze 2010 09:52
    pallid
    Poziom 20  

    Rectangle.contains(int x, int y)

    0
  • #7 20 Cze 2010 13:23
    przemo_wielki
    Poziom 23  

    No tak można to zastosować ale ma to pewne ograniczenia, nie mogę tego wywołać bezpośrednio dla typu Rectangle tylko dla jego obiektów które najlepiej jak będą w tablicy tak żeby po nazwach przejść tablice i sprawdzać dla każdego położenie (chyba że się mylę). Ale jest to napewno już jakieś rozwiązanie.

    Dodatkowo może zmieńmy problem mamy w Applecie 13elips, 10kół, 5 kwadratów, 5obrazków ... i jak pobrać ich nazwy? Głównie chodzi mi o to że chcę zrobić Drag&Drop obiektu a wydaje mi się że jakaś metoda dla wszystkich obiektów coś na wzór getClass().getComponent()... musi być (chyba...).

    //no dobra jakoś to działa (ale brzydkie to jak ...) :)

    Code:
        public void mouseClicked(MouseEvent e) {
    

            for(int i=0;i<3;i++){
                if(rect[i].contains(e.getX(), e.getY())){
                    System.out.println("rect"+i);
                }
            }
        }

    0
  • Pomocny post
    #8 20 Cze 2010 15:28
    Ballbreaker
    Poziom 11  

    Niefachowo, ale będzie działać.

    Nie jestem programistą javy, ale widzę conieco:

    Fachowe rozwiązanie, to uczynić z rectangle kontrolkę, przez dziedziczenie po klasie, która zawiera odpowiedź na zdarzenie OnClick, i przeładować mu metodę reagującą na tenże 'OnClick' zdarzenie.

    Przemo: intuicja jest bardzo ważna, jeśli czujesz/chcesz że można to zrobić lepiej, to gryź temat póki żyje.

    A teraz niech się wypowiedzą fachowcy od J2*E.

    Pozdrawiam

    0
  • #9 20 Cze 2010 17:07
    gaskoin
    Poziom 38  

    przemo_wielki napisał:
    Niestety to rozwiązanie mnie nie zadowala bo jak weźmiemy większą liczbę obiektów (docelowo 32) to co wtedy, przecież nie będę sprawdzał wszystkich przypadków (takiego rozwiązania nawet nie brałem pod uwagę)?

    Dzięki za odp.

    //this.getMousePosition().x "ładniej" zastąpić poprostu e.getX();


    przedstawiłeś problem, jako tak błahy, że uznałem, że programujesz w javie od wczoraj:P

    z e.getX() się nie zgodzę, ktoś kto przegląda kod na szybko szybciej wyłapie to MousePosition, niż zajarzy, że e to obiekt typu MouseEvent, więc metoda getX() zwróci położenie myszy :)

    a nazwę zadeklarowanego obiektu można uzyskać poprzez

    this.getClass().getFields()[x].getName(), ale raczej się nie przyda do dnd

    0