• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program rysuje wszystkie figury oprócz prostokąta.

Object Storage Arubacloud
0 głosów
313 wizyt
pytanie zadane 17 maja 2021 w Java przez p_wika Nowicjusz (190 p.)
otagowane ponownie 17 maja 2021 przez p_wika

Cześć, mam problem z paintem w Javie. Mianowicie jestem w stanie narysować wszystkie figury, z wyjątkiem prostokąta. Czy ktoś widzi gdzie jest problem? Z góry dzięki za pomoc.

Tu klasa prostokąt:

class Prostokat implements Figura {

    int x1, y1, x2, y2;
    int Xmax, Xmin, Ymax, Ymin;
    int width, height;
    Color kolor = new Color(0);


    public void setX1(int x1) { this.x1 = x1; }

    public void setY1(int y1) { this.y1 = y1; }

    public void setX2(int x2) { this.x2 = x2; }

    public void setY2(int y2) { this.y2 = y2; }


    public int getX1() { return this.x1; }

    public int getY1() { return this.y1; }

    public int getX2() { return this.x2; }

    public int getY2() { return this.y2; }


        public void Rysuj(Graphics g){

            Xmax = Math.max(x1, x2);
            Xmin = Math.min(x1, x2);
            Ymax = Math.max(y1, y2);
            Ymin = Math.min(y1, y2);

             width = Xmax - Xmin;
             height = Ymax - Ymin;

            g.setColor(kolor);
            g.fillRect(Xmin, Ymin, width, height);
        }

    /**
     * Ustawiamy kolor dla prostokąta
     */
    public void UstawKolor(Color kolor) { this.kolor = kolor; }

    public boolean CzyZawiera(int x, int y){ // typu boolean; zwraca true jeżeli warunek jest spełniony
        return (x > Xmin && x < Xmax &&  y > Ymin && y < Ymax);
    }

    }

Tutaj fragment klasy z metodami :

class RysujFigure extends JPanel {

    int x, y;

    public int indeks;
    static ArrayList<Figura> figury = new ArrayList<>();
    Figura obecnyTypFigury;
    Figura figura;
    private JPopupMenu popupMenu;

    public RysujFigure() {

        setDoubleBuffered(true);
        ObslugaMyszy mouse = new ObslugaMyszy();
        addMouseListener(mouse);
        popup();
    }

   
    /**
     * Metoda odpowiedzialna za rysowanie figur.
     */
    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        for (Figura p:figury) p.Rysuj(g);
    }

    /**
     * Ta klasa wewnętrzna obsługuje wybór figury po naciśnięciu myszy.
     */

    class ObslugaMyszy extends MouseAdapter {
        /**
         * Dodajemy nową figurę do listy figur.
         */
        public void mousePressed(MouseEvent event) {

            switch (indeks) {
                case 1:
                    figura = new Okrag();
                    break;
                case 2:
                    figura = new Prostokat();
                    break;
                case 3:
                    figura = new Trojkat();
                    break;
            }

            if (indeks == 1 || indeks == 2 || indeks == 3){

                figury.add(figura);

                figura.setX1(event.getX());
                figura.setY1(event.getY());
            }

            if (indeks == 0) {
                //x, y zadeklarowane na początku klasy głównej
                x = event.getX();
                y = event.getY();

                for(int i = figury.size()-1; i >= 0; i--){
                    if(figury.get(i).CzyZawiera(x,y)) {
                        obecnyTypFigury = figury.get(i);
                        break;
                    }
                }
            }
        }

        /**
         * Po wybraniu konkretnej figury możemy ją później edytować
         */
        public void mouseReleased(MouseEvent e) { indeks = 0; }

    }
}

I dla porównania działająca klasa okrąg:

class Okrag implements Figura {

        /** Deklarujemy punkty lewego górnego i prawego dolnego rogu.
         * Deklarujemy zmienne odpowiedzailne za maksymalne i minimalne wartości tych punktow.
         * a- promień; kolor odpowiada za kolor figury
         */
        int x1, y1, x2, y2;
        int Xmax, Xmin, Ymax, Ymin;
        int r;
        Color kolor = new Color(0);

        /**
         * Ustawiamy pierwsza wspolrzedna jednego punktu.
         */
        public void setX1(int x1) { this.x1 = x1; }
        /**
         *  Ustawiamy druga wspolrzedna jednego punktu.
         */
        public void setY1(int y1) { this.y1 = y1; }
        /**
         *  Ustawiamy pierwsza wspolrzedna drugiego punktu.
         */
        public void setX2(int x2) { this.x2 = x2; }
        /**
         * Ustawiamy druga wspolrzedna drugiego punktu
         */
        public void setY2(int y2) { this.y2 = y2; }


        /**
         * Ustawiamy pierwsza wspolrzedna poczatkowego punktu
         */
        public int getX1() { return this.x1; }
        /**
         * Ustawiamy druga wspolrzedna poczatkowego punktu
         */
        public int getY1() { return this.y1; }
        /**
         * Ustawiamy pierwsza wspolrzedna koncowego punktu
         */
        public int getX2() { return this.x2; }
        /**
         * Ustawiamy druga wspolrzedna koncowego punktu
         */
        public int getY2() { return this.y2; }

        /** Metoda wyznaczajaca maksymalne i minimalne wartosci punktow oraz rysujaca kolo
         *
         */
        public void Rysuj(Graphics g){

            Xmax = Math.max(x1, x2);
            Xmin = Math.min(x1, x2);
            Ymax = Math.max(y1, y2);
            Ymin = Math.min(y1, y2);
            r = Math.max(Xmax - Xmin, Ymax - Ymin);

            g.setColor(kolor);
            g.fillOval(Xmin, Ymin, r, r);
        }

        /**
         * Ustawiamy kolor dla okręgu
         */
        public void UstawKolor(Color kolor) { this.kolor = kolor; }

        public boolean CzyZawiera(int x, int y){
            return(x > Xmin && x < (r + Xmin) && y > Ymin && y < (r + Ymin));
        }

}

 

1 odpowiedź

0 głosów
odpowiedź 17 maja 2021 przez Wiciorny Ekspert (273,810 p.)
    if (indeks == 1 || indeks == 2 || indeks == 3){
 
                figury.add(figura);
 
                figura.setX1(event.getX());
                figura.setY1(event.getY());
            }
 

dodajesz obiekt figura do figur, bez ustawienia jego wartości. 
potem ustawiasz wartości obiektu figura, z tym że aktualnie to co znajduje się wewnątrz "figury" jest nieustawione ? 

komentarz 18 maja 2021 przez p_wika Nowicjusz (190 p.)
Dlaczego więc ten fragment programu wykonuje się dla okręgu i  trójkąta? Chyba nie tu leży problem..
komentarz 18 maja 2021 przez Wiciorny Ekspert (273,810 p.)
sam problem tu nie leży, bo to będzie działać gdyż przekazujesz kopie referencji dlatego działa, nie obiekt, ale tylko "referencje w postaci kopii" na wskazany obiekt.
Moim zdaniem metoda "czyZawiera" swoją droga pisz camelem w javie, nie z dużej, powinna uwzględniać fakt nie tylko "większy" "mniejszy" ale - równy. czyli wartości brzegowe, spróbuj w ten sposób

Podobne pytania

0 głosów
1 odpowiedź 121 wizyt
pytanie zadane 24 kwietnia 2020 w JavaScript przez DanexZ Obywatel (1,270 p.)
0 głosów
1 odpowiedź 913 wizyt

92,760 zapytań

141,684 odpowiedzi

320,470 komentarzy

62,104 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...