Swing Dynamisch zeichnen mit Shapes wie Rectangle2D.Float ?

poku17

Mitglied
Hey ho, habe gerade ein kleines Projekt laufen mit mehreren Tabs. Wo einer der Tabs ein kleines Malprogramm werden soll. Möchte das ganze auf Graphics2D und den Shapes aufbauen.
Hatte in Graphics mir ein kleines Prog schon geschrieben gehabt, wo ich ein rechteck mit der maus von startPunkt -> endpunkt zeichnen konnte und es auch in den negativen bereich zeichnen konnte, also wenn ich die maus dann nach links oben gezogen habe waren die werte negativ, aber er hat es einfach gezeichnet.

Hier ein KSKB dazu ohne Shapes :
[Java]

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class DynamicDraw extends JFrame implements MouseListener, MouseMotionListener{

private int xPos = 0, yPos = 0, mXpos = 0, mYpos = 0;
private JPanel pane;

DynamicDraw(String title){
super(title);

pane = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

if(xPos < mXpos && yPos < mYpos){
g2d.drawRect(xPos, yPos, mXpos - xPos, mYpos - yPos);
}
if(xPos > mXpos && yPos > mYpos){
g2d.drawRect(mXpos, mYpos, xPos - mXpos, yPos - mYpos);
}
if(xPos < mXpos && yPos > mYpos){
g2d.drawRect(xPos, mYpos, mXpos - xPos, yPos - mYpos);
}
if(xPos > mXpos && yPos < mYpos){
g2d.drawRect(mXpos, yPos, xPos - mXpos, mYpos - yPos);
}
}
};
pane.addMouseListener(this);
pane.addMouseMotionListener(this);
add(pane);
}

public void mouseDragged(MouseEvent e) {
mXpos = e.getX();
mYpos = e.getY();
repaint();
}
public void mousePressed(MouseEvent e) {
xPos = e.getX();
yPos = e.getY();
}

public void mouseMoved(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

public static void main(String[] args){
DynamicDraw dd = new DynamicDraw("Test");
dd.setSize(500,400);
dd.setVisible(true);
}
}

[/Java]
Meine frage lautet, weis jmd wie ich dieses Verhalten mit den Shape.Rectangle2D.Float hinbekomme ?
Denn bei mir will er dies einfach nicht machen...
 
'Verhalten hinbekommen' klingt reichlich ungenau, was genau willst du machen?
statt diverse x und y einzeln zu speichern kannst du auch Rectangle-Objekte erstellen, das dürfte doch klar sein,

dann die Rectangle in eine Liste, in paint malen, alles eher einfache Schritte,
da kann man nicht viel zu sagen als den kompletten Code für dich zu programmieren,
welche Schwierigkeiten hast du konkret?
 
ok, dann hatte ich mich wohl nicht klar genug ausgedrueckt, habe auh eine arraylist mit den shapes und die shapes lassen sich auch mit der maus zeichnen, aber wenn ich:

vom anfang der Zeichnung (mousePressed) bis (mouseReleased) ein Rechteck ziehen möchte, ich die maus aber nach links bewegen, zeichnet er bei den shapes trotzdem nach rechts, so nun fuer mein prob auch ein beispiel mit den Shapes....

KSKB mit den Shapes:
[Java]

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.*;


public class DynamicDrawShape extends JFrame implements MouseListener, MouseMotionListener{

private int xPos = 0, yPos = 0, mXpos = 0, mYpos = 0;
private int width = 0, height = 0;
private boolean mPressed;
private ArrayList<Shape> shapes = new ArrayList<>();
private Rectangle2D.Float rect;
private JPanel pane;

DynamicDrawShape(String title){
super(title);

pane = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

if(!mPressed){
rect = new Rectangle2D.Float(xPos, yPos, width, height);
shapes.add(rect);
}
else{
if(xPos < mXpos && yPos < mYpos){
width = mXpos - xPos;
height = mYpos - yPos;
}
if(xPos > mXpos && yPos > mYpos){
width = xPos - mXpos;
height = yPos - mYpos;
}
if(xPos < mXpos && yPos > mYpos){
width = mXpos - xPos;
height = yPos - mYpos;
}
if(xPos > mXpos && yPos < mYpos){
width = xPos - mXpos;
height = mYpos - yPos;
}
rect = new Rectangle2D.Float(xPos, yPos, width, height);
}
for(Shape s : shapes){
Rectangle2D.Float rec = (Rectangle2D.Float) s;
g2d.draw(rec);
}
g2d.draw(rect);

}
};
pane.addMouseListener(this);
pane.addMouseMotionListener(this);
add(pane);
}

public void mouseDragged(MouseEvent e) {
mXpos = e.getX();
mYpos = e.getY();
repaint();
}
public void mousePressed(MouseEvent e) {
xPos = e.getX();
yPos = e.getY();
mPressed = true;
}

public void mouseMoved(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {mPressed = false;}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

public static void main(String[] args){
DynamicDrawShape dd = new DynamicDrawShape("Test");
dd.setSize(500,400);
dd.setVisible(true);
}
}

[/Java]

da sind noch logik fehler drin und so, sollte jetzt auch nur auf die schnelle in beispiel liefern....
die Zahlen die Negativ sein sollten, sind es nicht und wenn ich es dann umdrehe z.B. aus xPos - mXpos -> mXpos - xPos, haben width und height minus werte, aber dann wird in den berecihen garnicht gezeichnet... hoffe das war nun ausführlich genug.....
 
Zuletzt bearbeitet:
> hoffe das war nun ausführlich genug.....

selbstverständlich, vorher nicht, nun sind Informationen da,
auch wenn der Fehler wieder als offensichtlich anzumeckern ist:
du drehst width und height korrekt ins positive, wie soll sich das aber zusammen mit festen x und y von 'normal positiven' Rechtecken unterscheiden?
hier liegt doch nicht ein Java-Problem vor, sondern überhaupt ein fachlicher Plan

die Lösung ist denkbar einfach: korrigiere auch den Startpunkt des Rechtecks, ist nicht immer x/y sondern manchmal eben auch mit etwas von mx/my,
wobei NICHT die x/y-Variablen überschrieben werden dürften, wie in einem anderen Thema schonmal falsch war
 
Zuletzt bearbeitet von einem Moderator:
Vertehe... also ist es mit shapes nur etwas komplizierter, weil man ihm auch die neue start poition geben muss und nicht nur das neue Ziel. Dann wird das wohl bei den funktionen Graphics.drawRect();, etc. schon verarbeitet und den shapes muss man das dann eben extra sagen^^...

THX 😀

[Java]

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import javax.swing.*;


public class DynamicDrawShape extends JFrame implements MouseListener, MouseMotionListener{

private int xPos = 0, yPos = 0, mXpos = 0, mYpos = 0, newXpos = 0, newYpos = 0;
private int width = 0, height = 0;
private boolean mPressed;
private ArrayList<Shape> shapes = new ArrayList<>();
private Rectangle2D.Float rect;
private JPanel pane;

DynamicDrawShape(String title){
super(title);

pane = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);

Graphics2D g2d = (Graphics2D) g;

if(!mPressed){
rect = new Rectangle2D.Float(newXpos, newYpos, width, height);
shapes.add(rect);
}
else{
if(xPos < mXpos && yPos < mYpos){
newXpos = xPos;
newYpos = yPos;
width = mXpos - xPos;
height = mYpos - yPos;
}
if(xPos > mXpos && yPos > mYpos){
newXpos = mXpos;
newYpos = mYpos;
width = xPos - mXpos;
height = yPos - mYpos;
}
if(xPos < mXpos && yPos > mYpos){
newXpos = xPos;
newYpos = mYpos;
width = mXpos - xPos;
height = yPos - mYpos;
}
if(xPos > mXpos && yPos < mYpos){
newXpos = mXpos;
newYpos = yPos;
width = xPos - mXpos;
height = mYpos - yPos;
}
rect = new Rectangle2D.Float(newXpos, newYpos, width, height);
}
for(Shape s : shapes){
Rectangle2D.Float rec = (Rectangle2D.Float) s;
g2d.draw(rec);
}
g2d.draw(rect);

}
};
pane.addMouseListener(this);
pane.addMouseMotionListener(this);
add(pane);
}

public void mouseDragged(MouseEvent e) {
mXpos = e.getX();
mYpos = e.getY();
repaint();
}
public void mousePressed(MouseEvent e) {
xPos = e.getX();
yPos = e.getY();
mPressed = true;
}

public void mouseMoved(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {mPressed = false;}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

public static void main(String[] args){
DynamicDrawShape dd = new DynamicDrawShape("Test");
dd.setSize(500,400);
dd.setVisible(true);
}
}
[/Java]
 
Zuletzt bearbeitet:
ist nicht wirklich komplizierter, schau dir deinen vorherigen Code an:
Java:
g2d.drawRect(xPos, yPos, mXpos - xPos, mYpos - yPos);
g2d.drawRect(mXpos, yPos, xPos - mXpos, mYpos - yPos);
die letzten beiden sind Breite und Höhe, welches du jetzt schon genauso korrigierst,
die ersten beiden sind der Startpunkt, durchaus auch veränderlich, dessen Korrektur du im Moment einfach gespart hast 😉
 
Da setzt wieder mein "Formulierungsmissgeschick" ein ^^ Es ist nicht komlpizierter, sondern nur ein klein wenig mehr Schreibarbeit 😀
 

Zurück
Oben