Swing Darstellung von JComponents in Swing

andi_help

Mitglied
Hallo,
ich habe ein kleines Problem mit Swing undkomme nicht auf die Lösung des einfachen Problems.
Ich will in einem JFrame zwei JComponenten als Kreise darstellen. Leider wird mir nur immer einer angezeigt, der andere nicht. Könnt ihr mir dabei helfen?

Der Source-Code ist

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JComponent;
import javax.swing.JFrame;

class Circle extends JComponent{

	int x, y;
	
	Circle(int x, int y){
		this.x=x;
		this.y=y;
		setVisible(true);
	}
		
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D)g;		
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
		RenderingHints.VALUE_ANTIALIAS_ON);     
		g2d.drawOval(x, y, 30, 30);
		repaint();
	}
}		

public class Rahmen extends JFrame{

	Rahmen(){
		setVisible(true);
		setSize(400, 400);
		setLocation(100, 100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		Rahmen rahmen=new RAamen();
		Circle x=new Circle(50, 50);
		Circle x1=new Circle(250, 250);
		rahmen.add(x);
		rahmen.add(x1);
	}
}

Vielen Dank schon mal!!
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
JFrame hat standardmäßig nen borderlayout. add ohne Angabe von contraints fügt die Komponente ins Center Fes borderlayout und dort kann nur eine komponente liegen.
 

beastofchaos

Bekanntes Mitglied
Soll heißen, dass du besser

Java:
// rahmen.setLayout(new BorderLayout());   [standardmäßig]
rahmen.add(x, BorderLayout.NORTH);
rahmen.add(x1, BorderLayout.CENTER);

schreibst. Oder für eine gleichmäßige Verteilung:

Java:
rahmen.setLayout(new GridLayout(2, 1));
rahmen.add(x);
rahmen.add(x1);

Denn beim BorderLayout wird die Komponente standardmäßig in die Mitte gelegt, wenn du keine Richtugn angibst, und verdeckt damit in diesem Fall, den Kreis darunter ;)


Nur so nebenbei:
Ich will ja nicht in deine Code-Struktur eingreifen, aber Kindklassen von Component haben automatisch die Eigenschaft "Location". Die könntest du hier statt den extra Integer-Werten x und y benutzen.
Also:
Java:
Circle x = new Circle();     // Eigenschaften x und y sind gestrichen und paintComponent nutzt getLocation()
Circle x1 = new Circle();

x.setLocation(new Point(50, 50));
x1.setLocation(new Point(250, 250);

Gruß, Thomas
 

andi_help

Mitglied
Vielen Dank!

Ich sehe schon, ich muss da noch etwas ändern, da eigentlich ein Kreis dort erscheinen soll, wo man geklickt. Jedoch soll man auch noch auswählen können, welche Form man anfügt, sprich, wenn F2 gedrückt, dann kann man Kreise einfügen, wird dann F3 gedrückt, dann werden Rechtecke gezeichnet.
Kreise und Rechtecke sollen jeweils Komponenten sein..mal sehen.

Gruss,
Andi
 

beastofchaos

Bekanntes Mitglied
Ich glaube, dass du, wenn du keine eigenen Listener oder so in deine Kreise/Rechtecke einbringst. Die Klasse "JComponent" da überflüssig ist. Mach lieber eine eigene Klasse "Circle" (Ohne Erbung) mit x, y und allem weiteren und füg ihr ne eigene Methode namens "paint(Graphis g)" oder so zu, die du dann im paintComponent von dem Panel aufrufst ;)

Mein Tipp als Grafikprogramm-Experte (ich schreib grad ein riesiges Projekt - ähnlich Paint.Net)...


Gruß, Thomas
 

andi_help

Mitglied
super! hat geklappt..
Wenn ich jetzt noch erreichen, dass mein Kreis an der Position x,y gezeichnet (x,y sind Koordinaten eines Mausklicks auf das Panel), dann darf ich Circles wieder zu einer JComponent machen und die Koordinaten mittels eines MouseListeners innerhalb der Klasse Circles ermitteln..Ist meine Idee korrekt?

Vielen Dank in jedem Falle schon mal.
 
B

beastofchaos2

Gast
nein nein. den mouselistener hat in dem fall das panel. wenn du dir kreise zu komponemts machst, musst dudenen auch einen geben, da sie an ohren stellen den listener des panels überdecken, was nochmal umständlicher wär. das würde nur dann sinnachen, wenn du sie auch per ziehen bzw mouseDragged verschieben willst. wüsste gern nebenbei, wie es abstelle, dass eine komponente den listener einer darunter liegenden verdeckt. (tut sie doch oder?)

gruß thomas
 

andi_help

Mitglied
Die Kreise sollten dann noch verschoben werden können. Dann brauche ich zwei MouseListener, einen für meine JComponent und einen für mein JPanel.
Wie ich das dann hinkriege weiß ich leider noch nicht.
 

beastofchaos

Bekanntes Mitglied
Im Grund genommen braucht du nur einen Listener auf dem Panel. Der sollte, wenn du drauf klickst und einen Kreis "zur Seite schiebst" per Berechnung alles in mouseDragged erledigen :D Ich würde ehrlich gesagt, trotzdem ohne Komponente arbeiten, da das schnell Probleme geben könnte, beim Verschieben etc. Geh lieber zu eigenen simplen Klassen über. Da lernt man auch schnell was :)

Fang erst mal am besten an, deine Klasse iwie in so eine Überklasse zu stecken:

Java:
public abstract class Shape{        // Eigene Klasse (Vorsicht Namenszwilling von der richtigen Klasse Shape)
    public int x = 0;
    public int y = 0;
    
    public Shape(){
        this(0, 0);
    }
    
    public Shape(int x, int y){
        this.x = x;
        this.y = y;
    }

    public Rectangle getRectangle(){
        return new Rectangle( x - 10, y - 10, x + 10, y + 10);
    }
    
    public void paint(Graphics g){
        ((Graphics2D)g).setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0));
        g.setColor(Color.black);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    }
}

Durch dieses abstrakte Klasse klassifizierst du schonmal deine beiden Zeichentypen. In denen Kindklassen (z.B. mit Namen Circle und Rectangle) muss du eig nur noch die paint-Methode überschreiben (+super.paint(g) aufrufen natürlich) und die entsprechende Zeichenart schreiben muss(drawRect(), drawEllipse()). Für ein kleines Problem, reicht dieser Aufbau locker. Wenn es aber professionell werden soll, kommen natürlich noch clone-, clear-, getter-, setter- und ähnliche Methoden dazu ;) Die paint-Methoden rufst du dann in paintComponent vom JPanel auf und soweit wäre das schonmal gelöst.

Zum Verschieben: Im MouseListener des Panels könntest du nun, per
Code:
shape.getRectangle().contains(evt.get(), evt.getY())
rausfinden, ob die Maus darin ist und per Berechnung bei mouseDragged die Differenz nehmen und x/y entsprechend verändern. Das könnte ich dir ruhig geben, da ich denke, dass du es schnell verstehst. Wenn eigene Klassen zu umständlich sind, kannst du es auch mit den Klassen Rectangle und Ellipse2d.Double versuchen.

Ich hoffe, ich spreche nicht wieder zu kompliziert (ich schau nochmal alles kurz durch). Helfe dir gerne mit Code, da ich denke, dass du es nicht einfach kopierst, sondern auch anschaust und verstehst.

Gruß, Thomas

PS: Das hier behandelt erstmal nur die Ordnung der Komponenten und deren Zeichnung. Das er erstmal bei einem Klick ins leere da einfach eine neue Form erstellt, ist dann echt nur noch Pipifax :p
 

andi_help

Mitglied
Vielen Dank für die Hilfe. Das hat echt gut funktioniert.
Auf die Idee der abstrakten Klasse wäre ich nicht gekommen. Das dann abzuleiten und zu zeichnen ist dann ja einfach..
Zum Verschieben also dann am besten den MouseListener so adaptieren, dass ich prüfe, ob der Mousezeiger in einem Objekt ist, oder?

Gruss,
Andi
 

beastofchaos

Bekanntes Mitglied
Genau. Also am besten in mousePressed in eine globale boolean-Variable per
Code:
Rectangle.contains(Point p)
bei Rechtecken speichern, bei Kreisen Entfernung messen mittels des Satzes des Pythagoras, um die Entfernung zum Mittelpunkt zu ermitteln.
Außer dieser boolean (könnte z.B.
Code:
boolean mouseInObject = false
heißen), brauchst du eine Point-Variable, die die Position bei mousePressed speichert (nennen wir sie mal
Code:
Point posA
), und bei mehreren Objekten brauchst du noch iwie einen Verweis auf das gewählte Objekt. Entweder speicherst du das Selektierte Teil "selbst" in einem Objekt deiner abstrakten Klasse Shape (nennen wir es mal
Code:
Shape choosedObject
) oder du speicherst eine Integer als Index, vorausgesetzt, du speicherst alle Objekte in einer ArrayList<Shape>. Dann brauchst du später nur
Code:
shapeList.get(choosedIndex)
aufrufen, um das selektierte Objekt zu bekommen ;)

Der zweite Schritt geschieht in mouseDragged, wo du dann zu Punkt posA die Differenz berechnest und entsprechend die Position des selektierten Objektes veränderst. Nicht vergessen, danach posA zu aktualisieren (mit dem neuen Punkt gleichsetzen).

Das ganze ist vll. ein bisschen zu genau und du hättest das warsch. genauso gut hinbekommen. Aber ich dachte, weil ich in meinem Programm auf diese Weise arbeite, spar ich damit deinen Grips ;)

Gruß, Thomas
 

andi_help

Mitglied
Ich habe jetzt mal den ersten Schirtt nachvollzogen, und für die Objekt ne Array_Liste<Shape> angeleg. Über die Funktion addCircle werden jetzt neue Objekte eingefügt.
Der MouseListener mag nicht so. Nach der Definition des Punktes PosA iteriere ich über die ArrayList und lasse nach dem Punkt suchen, für den Objekt den Punkt enthält. Leider funktioniert die Abfrage mit contains() nicht. Hast Du ne Idee warum?

Meine aktuelle JPanel Syntax ist dies:

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JPanel;

public class MyPanel extends JPanel implements MouseListener{
	
	public ArrayList<Shape> Array_Shape; 
	public int x, y;
	Point A;
	
	MyPanel(){
		Array_Shape=new ArrayList<Shape>();
		addMouseListener(this);
	}
		
	@Override
	public void paintComponent(Graphics g){
		super.paintComponents(g);
		Graphics2D g2d=(Graphics2D) g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
		Circle circ1=addCircle(40, 50);
		circ1.paint(g);
	}
	
	public Circle addCircle(int a, int b){
		Circle circ1=new Circle(a,b);
		Array_Shape.add(circ1);
		return circ1;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		A=new Point(e.getX(), e.getY());
		int chosenObject=0;
		for (Shape sh: Array_Shape){
			if (sh.contains(A)){
				chosenObject=indexOf(sh);
			}
		}
		
	}
}
Vielen Dank, Andi
 
Zuletzt bearbeitet von einem Moderator:

beastofchaos

Bekanntes Mitglied
als erstes solltest du mal in paintComponent das addcircle entfernen. der erzeugt nun bei jedem neuzeichnen einen weiteren kreis. und glaub das wird unglaublic oft aufgerufen... ruf das lieber für sagen wir mal 2 objekte im konstruktor auf.
Außerdem solltest du mal zeigen wie bei dir contains aussieht, wenn du nun eine eigene klasse shape wirklich gemacht hast. und benutz mal lieber mousePressed ;-) und zum zeichnen musst du henau wie in deiner contains-abfrage eine for-schleife benutzen für jedes objekt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
D Button und Textfeld Darstellung AWT, Swing, JavaFX & SWT 3
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
Y Darstellung und MouseHover bei bestimmten Wörtern in einem String AWT, Swing, JavaFX & SWT 2
W Swing bzgl. Tableskalierung/Darstellung einer Matrix AWT, Swing, JavaFX & SWT 8
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Swing JTable, wie erreiche ich folgende Darstellung? AWT, Swing, JavaFX & SWT 10
M AWT LabelArray verschobene Darstellung AWT, Swing, JavaFX & SWT 2
B Transformation und Darstellung von Koordinaten AWT, Swing, JavaFX & SWT 5
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
M Swing JTable drucken/Darstellung AWT, Swing, JavaFX & SWT 2
E Swing Darstellung einer Zeilenbar AWT, Swing, JavaFX & SWT 6
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
U Swing Problem bei der Darstellung "komplexer Objecte" in einer JList mit AbstractListModel: AWT, Swing, JavaFX & SWT 3
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
A Darstellung dauert zu lange. Wie rest verzögern? AWT, Swing, JavaFX & SWT 7
S LayoutManager Fehlerhafte Darstellung einer Statusleiste/Statusbar AWT, Swing, JavaFX & SWT 6
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
S Grafische Darstellung von signalen AWT, Swing, JavaFX & SWT 2
S jTable size und Text darstellung AWT, Swing, JavaFX & SWT 2
L SWT Darstellung des Datums in Textfeld? AWT, Swing, JavaFX & SWT 2
M SWT Probleme bei der Darstellung des "&"-Zeichens... AWT, Swing, JavaFX & SWT 3
E Darstellung komplexer Formen, z.B. gebogener Pfeil AWT, Swing, JavaFX & SWT 2
P Problem mit Darstellung von JButton(s) AWT, Swing, JavaFX & SWT 2
D Darstellung in Swing wie HTML? AWT, Swing, JavaFX & SWT 2
R Darstellung von JButton AWT, Swing, JavaFX & SWT 6
G Swing Darstellung JTable AWT, Swing, JavaFX & SWT 2
T Swing Java Darstellung einer Tabelle AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Darstellung Java 5 und 6 AWT, Swing, JavaFX & SWT 7
B Probleme bei JPanel Darstellung AWT, Swing, JavaFX & SWT 6
M GBL - Darstellung gestreckt? AWT, Swing, JavaFX & SWT 3
P Applet darstellung von Textfeldern Problem AWT, Swing, JavaFX & SWT 3
O JComboBox andere Darstellung des Inhaltes + größe der Auswah AWT, Swing, JavaFX & SWT 11
M Swing mit Gtk - Fehlerhafte Darstellung AWT, Swing, JavaFX & SWT 3
S JTree - Darstellung von Ordnern rückwärts AWT, Swing, JavaFX & SWT 4
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
H Darstellung einer Kurve im Koordinatensystem AWT, Swing, JavaFX & SWT 8
T [gelöst] JFrame Grundlagen (Größe und Darstellung) AWT, Swing, JavaFX & SWT 6
G JTable dynamische Darstellung der ankommenden Daten AWT, Swing, JavaFX & SWT 19
G Darstellung von JComboBox AWT, Swing, JavaFX & SWT 14
S Gui Darstellung AWT, Swing, JavaFX & SWT 2
M Komische Sache bei der Darstellung auf einem JPanel AWT, Swing, JavaFX & SWT 5
S Swing Element für Explorer-Fenster darstellung AWT, Swing, JavaFX & SWT 13
P Darstellung eines Graphen AWT, Swing, JavaFX & SWT 2
G keine darstellung in JTable AWT, Swing, JavaFX & SWT 2
A JLabel: Unterschiede zw. JRE 1.3 und 1.5 in der Darstellung AWT, Swing, JavaFX & SWT 3
B Komische Darstellung unter Windows 2000 AWT, Swing, JavaFX & SWT 2
Z Seltsame Darstellung verschachtelter GridBagLayouts AWT, Swing, JavaFX & SWT 2
M SWT Darstellung Linux / Win verschieden? AWT, Swing, JavaFX & SWT 4
P Fehlerhafte Darstellung bei JLabel.setText AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
D Wie Darstellung / Layout als Liste AWT, Swing, JavaFX & SWT 2
T darstellung eines polynom 5.grades AWT, Swing, JavaFX & SWT 2
S JTable + Sortieren => Problem bei Darstellung AWT, Swing, JavaFX & SWT 13
U JSlider - Probleme bei der Darstellung AWT, Swing, JavaFX & SWT 3
V jTalbe: Probs bei Icon Darstellung AWT, Swing, JavaFX & SWT 4
Z Empfehlung für solche Darstellung! AWT, Swing, JavaFX & SWT 4
F Darstellung von Tastaturkürzel in JMenuItem AWT, Swing, JavaFX & SWT 13
R Mehrzeilige Darstellung von Spalten in SWING-Tabellen AWT, Swing, JavaFX & SWT 5
M Problem mit JTree-Darstellung AWT, Swing, JavaFX & SWT 5
T Problem mit Darstellung AWT, Swing, JavaFX & SWT 6
P Swing Wie sollte man seine JComponents vererben? AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
T JComponents zur Laufzeit auf JPanel darstellen AWT, Swing, JavaFX & SWT 10
L JComponents vertauschen AWT, Swing, JavaFX & SWT 2
L JComponents in Array AWT, Swing, JavaFX & SWT 11
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
M JComponents wird nicht anggezeigt AWT, Swing, JavaFX & SWT 5
P Selbstgezeichnete JComponents AWT, Swing, JavaFX & SWT 5
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
G JComponents tag vergeben AWT, Swing, JavaFX & SWT 6
M Linie zwischen JComponents AWT, Swing, JavaFX & SWT 5
T JComponents abändern/modifizieren z.b. JSlider AWT, Swing, JavaFX & SWT 2
N Rahmen zum editieren der Größe eines JComponents? AWT, Swing, JavaFX & SWT 2
N Mehrere JComponents übereinander AWT, Swing, JavaFX & SWT 3
G JComponents AWT, Swing, JavaFX & SWT 4
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben