Rysowanie z listy

Rysowanie z listy
ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

Witam. Rysuje sobie figury i dodaje je do listy pozniej za pomoca metody Rysuj w petli odrysowuje figury. Problem polega na tym ze w metodzie Rysuj mam jakas kolejnosc odrysowywania-efekt taki ze niektore figury rysowane biezaco sa pod figurami narysowanymi wczesniej a chcialbym ze rysowana figura byla na wierzchu.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Rysuj w kolejności dodawania figur do listy.

Haskell
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4700
0

Stwórz jedną listę z różnymi typami figur. Poczytaj o typie Object albo zastosuj dziedziczenie.

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0
Kopiuj
private Kwadrat kwadratt;


kwadrat = new Rectangle2D.Float((float)beginX,(float)beginY, (float)width, (float) height);
kwadratt = new Kwadrat(kwadrat,colorPedzla,true);
listaKwadratow.add(kwadratt);

w klasie kwadrat mam pole Rectangle kwadrat, colorPedzla, i CzyWypelniony.
i tak z kazda figura robie

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

Tak z grubsza

Kopiuj
class Figura
{
    Shape shape;
    boolean isFilled;
    Color borderColor;
    Color fillingColor;
    ...
}
class Kwadrat extends Figura
{
    ...
}
...
List<Figura> figury = new ArrayList<Figura>();

Po krótkim zastanowieniu myślę, że klasy dziedziczące po klasie Figura są niepotrzebne.

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

super dziękuje bogdans za pomoc ! działa ! a jak zrobić ołówek i tez zeby dodawalo do listy ? jeżeli linie prostą mam tak :

Kopiuj
jPanel1.update(g2);
            
            xEnd = evt.getX();
            yEnd = evt.getY();
            
            linia = new Line2D.Float((float)xStart,(float)yStart, (float)xEnd, (float) yEnd);
            figura = new Figura(linia,colorPedzla,false);
            listaFigur.add((Figura) figura);
            
            Rysuj();
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Dodasz figurę tak

Kopiuj
Rectangle2F.Float kwadrat = new Rectangle2D.Float((float)beginX,(float)beginY, (float)width, (float) height);
Figura figura = new Figura(kwadrat,colorPedzla,true);
figura.add(figura)

A rysowanie będzie wyglądało tak:

Kopiuj
for(Figura figura: figury)
{
    //ustawienie parametrów
    if(figura.isFiiled)
    {
        g2.fill(figura);
    }
    else
    {
        g2.draw(figura);
    }
}
ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0
Kopiuj
            xEnd = evt.getX();
            yEnd = evt.getY();

            olowek = new Line2D.Float((float)xStart, (float)yStart, (float)xEnd, (float)yEnd);
            xStart = xEnd;
            yStart = yEnd;
            figura = new Figura(olowek,colorPedzla,false);
            listaFigur.add((Figura) figura);

Mam coś takiego . Rysuje mi ale problem polega na tym ze nie odrysowuje mi tego pozniej z listy

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Ten fragment wygląda na poprawny, musiałbym zobaczyć cały kod.

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0
Kopiuj
 private void jPanel1MouseDragged(java.awt.event.MouseEvent evt) {                                     

        switch (przycisk) {
            case 0:

                xEnd = evt.getX();
                yEnd = evt.getY();

                olowek = new Line2D.Float((float) xStart, (float) yStart, (float) xEnd, (float) yEnd);
                xStart = xEnd;
                yStart = yEnd;
                Rysuj();
                g2.setColor(colorPedzla);
                g2.draw(olowek);
                break;
}

 private void jPanel1MouseReleased(java.awt.event.MouseEvent evt) {                                      

        switch (przycisk) {
            case 0:

                xEnd = evt.getX();
                yEnd = evt.getY();

                olowek = new Line2D.Float((float) xStart, (float) yStart, (float) xEnd, (float) yEnd);
                xStart = xEnd;
                yStart = yEnd;
                figura = new Figura(olowek, colorPedzla, false);
                listaFigur.add((Figura) figura);

                Rysuj();
                break;
}
Kopiuj
 private void Rysuj() {
        for (int i = 0; i < listaFigur.size(); i++) {
            g2.setColor(listaFigur.get(i).getkolor());
            if (listaFigur.get(i).getczyWypelniony() == true) {
                g2.fill(listaFigur.get(i).getfigura());
            } else {
                g2.draw(listaFigur.get(i).getfigura());
            }
        }
    }
bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0
  1. Twój ołówek jest punktem, pewnie jest rysowany ale trudno go zobaczyć. Początek ołówka powinieneś zapamiętać w zdarzeniu mousePressed.
  2. Masz złą organizacje rysowania. Zminimalizuj program a potem przywróć. Rysować należy w metodzie paintComponent, a w kodzie wywoływać 'repaint`.
ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

Jak zmieniłem na repaint() oraz dodałem metode paintComponent to znika wszyystko

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Po czym rysujesz, Panel, JPanel czy Canvas?
Jeśli JPanel, to powinieneś w nim nadpisać metodę paintComponent

Kopiuj
        @Override      
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g;
            for (int i = 0; i < listaFigur.size(); i++) {
            g2.setColor(listaFigur.get(i).getkolor());
            if (listaFigur.get(i).getczyWypelniony() == true) {
                g2.fill(listaFigur.get(i).getfigura());
            } else {
                g2.draw(listaFigur.get(i).getfigura());
            }
        }

Możesz z paintComponent wywołać metodę Rysuj ale wtedy musisz zmienić jej sygnaturę na private void Rysuj(Graphics g2).

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

A jak dodajesz JPanel? Prosty przykład

Kopiuj
        JPanel panel = new JPanel()
        {
            public void paintComponent(Graphics g)
            {
                g.drawLine(0,0,50,50);
            }
        };
        panel.setPreferredSize(new Dimension(300,300));
        add(panel);
ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

ja mam dodany w designerze JPanel w Netbeans

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

A konkretnie jak? Nie korzystam z designera - nie wiem jak wygląda wygenerowany kod.

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0
Kopiuj
private javax.swing.JPanel jPanel1;

tylko w kodzie jest o JPanel

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Omg. Są dwie możliwości:

  • import pakietu (klasy), a potem krótkie nazwy klas
Kopiuj
import javax.swing.JPanel;
...
private JPanel panel;
  • brak importu, a potem pełne nazwy klas
Kopiuj
...
private javax.swing.JPanel panel;

Ty tego nie wiesz i piszesz zaawansowane programy? Zadziwiające.

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
0

Nie zrozumiałem o co Ci chodzi. To w jaki sposob do JPanelu utworzyć tą metodę ?

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Pięć postów wcześniej masz przykład.

  • Rejestracja: dni
  • Ostatnio: dni
0

nadal nie działa

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

To popraw kod.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.