Rysowanie z listy

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.

0

Rysuj w kolejności dodawania figur do listy.

0

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

0
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

1

Tak z grubsza

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.

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 :

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();
0

Dodasz figurę tak

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:

for(Figura figura: figury)
{
    //ustawienie parametrów
    if(figura.isFiiled)
    {
        g2.fill(figura);
    }
    else
    {
        g2.draw(figura);
    }
}
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);

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

0

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

0
 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;
}
 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());
            }
        }
    }
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`.
0

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

0

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

        @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).

0

A jak dodajesz JPanel? Prosty przykład

        JPanel panel = new JPanel()
        {
            public void paintComponent(Graphics g)
            {
                g.drawLine(0,0,50,50);
            }
        };
        panel.setPreferredSize(new Dimension(300,300));
        add(panel);
0

ja mam dodany w designerze JPanel w Netbeans

0

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

0
private javax.swing.JPanel jPanel1;

tylko w kodzie jest o JPanel

0

Omg. Są dwie możliwości:

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

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

0

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

0

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

0

nadal nie działa

0

To popraw kod.

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