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...
 
S

SlaterB

Gast
'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?
 

poku17

Mitglied
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:
S

SlaterB

Gast
> 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:

poku17

Mitglied
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 :D

[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:
S

SlaterB

Gast
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 ;)
 

poku17

Mitglied
Da setzt wieder mein "Formulierungsmissgeschick" ein ^^ Es ist nicht komlpizierter, sondern nur ein klein wenig mehr Schreibarbeit :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
J Java 2D - dynamisch zeichnen AWT, Swing, JavaFX & SWT 4
D Systray-Icon dynamisch zeichnen AWT, Swing, JavaFX & SWT 8
W JavaFX Farben dynamisch anpassen AWT, Swing, JavaFX & SWT 4
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
A Swing JPanels dynamisch untereinander einfügen AWT, Swing, JavaFX & SWT 3
Wurstsemmel SWT MenuItem dynamisch hinzufügen AWT, Swing, JavaFX & SWT 2
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
MaxG. Swing Dynamisch grafische Objekte erzeugen AWT, Swing, JavaFX & SWT 12
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
S CombinedDomainXYPlot und dynamisch hinzugefügte subplots: Darstellungsprobleme AWT, Swing, JavaFX & SWT 3
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
llabusch JavaFX Dynamisch alles vergrößern (wie im Browser) AWT, Swing, JavaFX & SWT 3
agent47 JavaFX TreeView Struktur dynamisch einlesen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
D JavaFX Dynamisch erzeugte Checkboxen aus VBox auslesen AWT, Swing, JavaFX & SWT 3
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
I JTable dynamisch aus ArrayList befüllen AWT, Swing, JavaFX & SWT 3
T JavaFX Flexible Layouts dynamisch erstellen / Design-Inspirationen AWT, Swing, JavaFX & SWT 8
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
J JavaFX TextArea dynamisch Icon im Background anzeigen AWT, Swing, JavaFX & SWT 2
T JPanel dynamisch erstellen AWT, Swing, JavaFX & SWT 4
G FormLayout dynamisch wachsend AWT, Swing, JavaFX & SWT 0
T JTable dynamisch mit ArrayList AWT, Swing, JavaFX & SWT 2
A Swing Logikaufgabe: Zeilenanzahl einer JTable mit 3d String dynamisch anpassen AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
P TableViewerColumn dynamisch erzeugen AWT, Swing, JavaFX & SWT 3
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
A HELP: JFieldText dynamisch setzen -> langsam AWT, Swing, JavaFX & SWT 19
C Swing CardLayout dynamisch erweitern AWT, Swing, JavaFX & SWT 11
B Link eines Icons dynamisch gestalten AWT, Swing, JavaFX & SWT 2
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
P Gifs dynamisch auf GUI anzeigen AWT, Swing, JavaFX & SWT 4
E Breite eines JButton dynamisch ändern AWT, Swing, JavaFX & SWT 3
C SWT - widget dynamisch erzeugen und anzeigen AWT, Swing, JavaFX & SWT 10
C Tooltip dynamisch setzen AWT, Swing, JavaFX & SWT 7
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
X jTextFields dynamisch initialisieren AWT, Swing, JavaFX & SWT 2
A Swing Dynamisch Objekte erzeugen AWT, Swing, JavaFX & SWT 3
L Label dynamisch awt AWT, Swing, JavaFX & SWT 2
H Swing Symbol in Taskleiste dynamisch aus- bzw. einblenden AWT, Swing, JavaFX & SWT 14
B JTabbedPane mit Enumeration dynamisch füllen AWT, Swing, JavaFX & SWT 5
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
A AWT HSB-Farben dynamisch berechnen AWT, Swing, JavaFX & SWT 5
P Dynamisch Sortieren AWT, Swing, JavaFX & SWT 2
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
Airwolf89 Swing Dynamisch auf Objekte in einer GUI zugreifen AWT, Swing, JavaFX & SWT 10
Airwolf89 Swing Tabs dynamisch ausblenden AWT, Swing, JavaFX & SWT 3
H Swing Register (jTabbedPane) dynamisch hinzufügen? AWT, Swing, JavaFX & SWT 7
Airwolf89 Swing Anzahl der Tabellenspalten dynamisch setzen AWT, Swing, JavaFX & SWT 2
S SWT WizardPage - Button anzeigen und Text-Widgets dynamisch aktualisieren AWT, Swing, JavaFX & SWT 12
R JLabel und JSlider dynamisch erzeugen? AWT, Swing, JavaFX & SWT 3
W Swing dynamisch Buttons in JEditorPane erstellen AWT, Swing, JavaFX & SWT 2
Pithecanthropus Swing JPanels dynamisch austauschen AWT, Swing, JavaFX & SWT 8
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
Spot84 jtable mit checkboxnode dynamisch per arraylist füllen AWT, Swing, JavaFX & SWT 8
bugmenot Dynamisch erzeugte jLabels werden nicht angezeigt. AWT, Swing, JavaFX & SWT 5
ABstraCT JCombobox dynamisch füllen (erstes Element Problem) AWT, Swing, JavaFX & SWT 4
J JLabels usw. dynamisch anlegen AWT, Swing, JavaFX & SWT 8
A JList dynamisch vergrößern AWT, Swing, JavaFX & SWT 4
G Felder dynamisch erzeugen! AWT, Swing, JavaFX & SWT 3
I Textfields dynamisch erzeugen AWT, Swing, JavaFX & SWT 4
G Dynamisch Komponenten in einem JPanel bzw JFram austauschen AWT, Swing, JavaFX & SWT 7
B JTree dynamisch aufbauen AWT, Swing, JavaFX & SWT 3
L JPanel dynamisch zuweisen AWT, Swing, JavaFX & SWT 5
T Inhalt einer Combobox dynamisch erstellen? AWT, Swing, JavaFX & SWT 13
S JTextField-Größe dynamisch an Inhalt anpassen. AWT, Swing, JavaFX & SWT 3
S Farben eienr JTextPane dynamisch zuweisen AWT, Swing, JavaFX & SWT 2
J Zugriff auf "dynamisch erzeugte" JTextFields AWT, Swing, JavaFX & SWT 2
B JTree dynamisch nachladen AWT, Swing, JavaFX & SWT 3
U Label Icon dynamisch belegen AWT, Swing, JavaFX & SWT 12
F JRadioButton dynamisch benennen? AWT, Swing, JavaFX & SWT 7
A dynamisch weitere jpanels untereinander hinzufügen AWT, Swing, JavaFX & SWT 10
S dynamisch erzeugte buttons AWT, Swing, JavaFX & SWT 22
J Größe einer JTextArea dynamisch anpassen. AWT, Swing, JavaFX & SWT 2
F Komponente dynamisch erzeugen AWT, Swing, JavaFX & SWT 4
M ImageObserver, Bild dynamisch erzeugen und Speichern AWT, Swing, JavaFX & SWT 24
M gezeichnete Punkte dynamisch verschieben mit mousedragged AWT, Swing, JavaFX & SWT 4
S inhalt dynamisch erzeugter JComboBoxs auslesen AWT, Swing, JavaFX & SWT 3
G Mousecursor selber dynamisch generieren. AWT, Swing, JavaFX & SWT 6
G JRadioButton dynamisch erzeugen AWT, Swing, JavaFX & SWT 6
M Look and Feels dynamisch abfragen AWT, Swing, JavaFX & SWT 13
S Columnname dynamisch verändern AWT, Swing, JavaFX & SWT 2
H JComboBoxen dynamisch erzeugen AWT, Swing, JavaFX & SWT 3
K toolbar dynamisch erzeugen AWT, Swing, JavaFX & SWT 2
L Komponenten dynamisch erkennen und bearbeiten AWT, Swing, JavaFX & SWT 8
H große mengen an jbuttons dynamisch erzeugen? AWT, Swing, JavaFX & SWT 15
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben