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.
Rysuj w kolejności dodawania figur do listy.
Stwórz jedną listę z różnymi typami figur. Poczytaj o typie Object albo zastosuj dziedziczenie.
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
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.
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();
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);
}
}
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
Ten fragment wygląda na poprawny, musiałbym zobaczyć cały kod.
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());
}
}
}
- Twój ołówek jest punktem, pewnie jest rysowany ale trudno go zobaczyć. Początek ołówka powinieneś zapamiętać w zdarzeniu
mousePressed
. - Masz złą organizacje rysowania. Zminimalizuj program a potem przywróć. Rysować należy w metodzie
paintComponent
, a w kodzie wywoływać 'repaint`.
Jak zmieniłem na repaint() oraz dodałem metode paintComponent to znika wszyystko
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)
.
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);
ja mam dodany w designerze JPanel w Netbeans
A konkretnie jak? Nie korzystam z designera - nie wiem jak wygląda wygenerowany kod.
private javax.swing.JPanel jPanel1;
tylko w kodzie jest o JPanel
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.
Nie zrozumiałem o co Ci chodzi. To w jaki sposob do JPanelu utworzyć tą metodę ?
Pięć postów wcześniej masz przykład.
nadal nie działa
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.