Mehrere sich bewegende Objekte in einem Frame

TheDescent

Mitglied
Hallo

Ich möchte gerne zwei sich bewegende Objekte in einem Frame darstelln, und komme nun nicht weiter , da immer nur das zuletzt hinzugefügte Objekt in dem Frame läuft, aber nicht beide gleichzeitig....

Im Folgenden quellcode besitzen die Klassen Robutton und Münzen Jeweils methoden , die mithilfe eines Timers ,actionListener, und der repaint methode sich immer wieder aufrufen und sich somit bewegen,

Habe schon einiges versucht aber noch nichts hat wirklich funktioniert,
bitte um euren Rat



[JAVA=42]

private Robutton robo;
private Münze coin;

public Tisch(){

robo = new Robutton(200,200);
coin = new Münze(50,100);

JFrame Fenster =new JFrame();
Fenster.add(coin);
Fenster.add(robo);
Fenster.setTitle("Robuttons");
Fenster.setSize(300,280);
Fenster.setDefaultCloseOperation(EXIT_ON_CLOSE);
Fenster.setVisible(true);
Fenster.setResizable(true);
Fenster.setLocationRelativeTo(null);

}
[/code]
 

Marco13

Top Contributor
Hängt wohl auch mit dem Layout zusammen. Die beiden Klassen erben wohl von JComponent - ich find's ja häßlich, Sprites von JComponent erben zu lassen, aber das kriegt man irgendwie nicht ausgerottet. Mach' mal ein
frame.getContentPane().setLayout(null);
frame.getContentPane().add(coin);
frame.getContentPane().add(rob);
Falls dann nichts erscheint, müssen noch die Bounds der beiden Objekte passend gesetzt werden
coin.setBounds(x,y,w,h);
oder
coin.setSize(w,h);
coin.setLocation(x,y);
oder so...
 

TheDescent

Mitglied
Zeigt Leider keine Wirkung... nun wird gar nichts mehr dargestellt, nicht mal wenn ich nur ein Objekt hinzufüge.. gibt es noch andere möglichkeiten ?
 
S

SlaterB

Gast
überlege doch mal logisch, was sollte es anderes geben?
du hast eine Zeichenfläche, da kannst du einfach nur
1) fertige Komponenten pixelgenau platzieren, funktioniert auch wenn man es richtig macht, Code posten
2) vorgegebene Layouts verwenden die einen Teil der Arbeit erledigen, dann weniger Arbeit (nur add() aufrufen) aber auch weniger exakten Einfluss,
und natürlich muss man die Layouts kennen, etwa dass der Standard BorderLayout nur eine Komponente per einfachem add() akzeptiert, Bedienungsanleitung lesen
3) keine fertigen Komponenten setzen sondern paintComponent überschreiben, und mit Zeichenbefehlen Pixel für Pixel bemalen
 

TheDescent

Mitglied
Da ich noch nicht sehr viel erfahrung mit der Gui hab zeige ich euch am besten die beiden klassen Robutton und Münze, ich hoffe ihr könnt dort den fehler entdecken, weiß nicht mehr weiter, danke für die Tipps aber leider halfen sie mir bisjetzt noch nicht







Die Robutton Class

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.Random;
import javax.swing.JFrame;

public class Robutton extends JPanel implements ActionListener {


 
 
	
 Timer timer;
 private int x, y;
 private int xdir,ydir;

 
 
       public  Robutton(int x,int y) {
      
    
       timer = new Timer(25, this);
       timer.start();
   
       this.x = x;
       this.y = y;
      
       
       Random r = new Random();
       switch(r.nextInt(4)){
       
       case 1:
       
       xdir =(-1);
       ydir =(-1);   
       
       break;
       
       case 2:
       xdir=(1);
       ydir=(1);   
       break ;
       
       case 3:
       xdir =(-1);
       ydir =(1);   
       break;
       
       
       case 4:
    	   
       xdir=(1);
       ydir=(-1);   
       break;
       
       default:
       xdir=(0);
       ydir=(-1);   
       }}   
   

    
    public void paintcomponent(Graphics g) {
    
    	super.paint(g); 

        Graphics2D g2d = (Graphics2D)g;
        g2d.drawOval(x, y, 10, 10);
        g2d.setColor(new Color(241, 98, 69));
     	g2d.fillOval(x, y, 20, 20);
   	
    }


    public void actionPerformed(ActionEvent e) {
        
        x += xdir;
        y += ydir;
       
      
        
        if (y==0){
        
           setxdir(0);
           setydir(1);
        	
        }
        if (x==0){
            
            setxdir(1);
            setydir(0);
            	
            	
            }
        if (y==225){
            
            setxdir(0);
            setydir(-1);
            	
            	
            }
        if (x==264){
            
            setxdir(-1);
            setydir(0);
            
            	
            }
    

    	repaint();  
   
    	 }  	
 
public void setxdir(int x){
	xdir =x+xdir;
}
public void setydir(int y){
	ydir =y+ydir;
}
public void setx(int x){
	this.x+=x;
}
public void sety(int y){
	this.y+=y;
}

public  int getxdir(){
	return xdir;
}	
public int getydir(){
	return ydir;  
	 
  }	
public  int getx(){
	return 	x;
}	
public int gety(){
	return y;  
	 
}



}

Die Münze class



Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class Münze  extends JPanel implements ActionListener {
    
	Timer timer;
	private int x, y;
	 
	
	
	public Münze(int x , int y){
	
		

    timer = new Timer(25, this);
	timer.start();	
		
	this.x = x;
	this.y = y;
	
	}
	
    public void paintcomponent(Graphics g) {
		  super.paint(g);   


     Graphics2D g2d = (Graphics2D) g;	
     	    
        
         g2d.drawOval(x, y, 10, 10);
   	 g2d.setColor(new Color(130, 100, 84));
   	 g2d.fillOval(x, y, 20, 20);
     

   	 
	}
	public void actionPerformed(ActionEvent e) {
	

		
	repaint();

        }
	
	
	
	public void setx(int x){
		this.x =x;
	}
	public void sety(int y){
		this.y =y;
	}
	public  int getx(){
		return x;
	}	
	public int gety(){
		return y;  



}}
 

Marco13

Top Contributor
*drüberscroll*
public void paintcomponent(Graphics g) { :autsch:
public void paintComponent(Graphics g) { !!!
und innen super.paintComponent aufrufen...
 
S

SlaterB

Gast
> public void paintcomponent(Graphics g) {
> super.paint(g);

super.paintComponent(g);
aufrufen!
und c groß schreiben, so wird bisher ja überhaupt nix gemalt, richtig?

-----

ansonsten interessant, du verwendest also (schon immer oder neu?) von meinen genannten Ansätzen die Nummer 3)

dazu ist es wirklich nicht so leicht zwei Komponenten zu haben, die im selben Bereich malen,
normalerweise herscht jedes Panel über seinen eigenen Bereich, der super.paintComponent(g); löscht ja auch die Zeichenfläche,

besser wäre es, wenn die beiden Komponenten kein JPanel sind sondern einfache normale Klassen mit paint-Methoden,
dann brauchst du EIN JPanel, welches in die GUI eingefügt wird, und an dem repaint() aufgerufen wird,
und dieses eine JPanel ruft in seiner paintComponent-Methode die paint der beiden Klassen Robutton + Münze auf

komplizierte Aufgabe..
 

TheDescent

Mitglied
So, habe jetzt versucht das ganze in die tat umzusetzen, habe aber an folgendem problem:
Robutten und Münze sind nicht akzeptierte componenten, wenn ich sie in in ein Panel einfügen will, was muss ich also tun? , habe diesmal die repaint methode in einem ActionListener untergebracht,
und male die jeweiligen Objekte mit ihrer paint methode.

Angefügt liegt noch einmal die jetzige paintmethode der beiden Klassen Robutton und Münze vor (falls sich dort wieder ein Fehler eingeschlichen habe sollte ----> wie gesagt ich programmiere noch nicht lange mit der Gui ;))






Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.Timer;
import java.awt.*;

public class Tisch extends JFrame implements ActionListener{ 

private  Robutton robo;	
private  Münze coin;
private  MünzenList coins; 
private  boolean aufsammeln;
Timer timer;

	
	public Tisch  (){
	

	timer = new Timer(25, this);
	timer.start();
	
		
		
    robo =new Robutton(50,100);	
    coin = new Münze(100,200);	
    JFrame frame = new JFrame();
    JPanel pan = new JPanel();
    pan.add(coin);
    pan.add(robo);
    pan.paintComponents(getGraphics());
    frame.add(pan);
    frame.setTitle("Robuttons");
    frame.setSize(300,280);
    frame.setDefaultCloseOperation(Tisch.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setResizable(true);
	
	
	
	
	
	}


	
	public void actionPerformed(ActionEvent p){
	
		
		robo.paint(getGraphics());
		coin.paint(getGraphics());
		
		repaint();
		
		
		

		
	}

Paint methode:

Java:
    public void paint(Graphics g) {
    
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawOval(x, y, 10, 10);
        g2d.setColor(new Color(241, 98, 69));
     	g2d.fillOval(x, y, 20, 20);
 
S

SlaterB

Gast
der eine oder mehrere Timer rufen wie bisher repaint() beim JPanel auf, und zwar bei dem einzigen jetzt noch verbleibenden Panel,
mehr ist dort nicht zu tun,

in der paintComponent-Methode des JPanels ist dann das Graphics-Objekt verfügbar, das an die beiden zu zeichnenden Objekte übergeben,
niemals getGraphics() aufrufen
 

Michael...

Top Contributor
Warum erzeugst Du in einem JFrame einen zweiten JFrame. Ein Aufruf von getGraphics() auf Komponenten sollte man nur machen, wenn man weiss was man tut. In Deinem Fall sollte es sogar null zurückgeben und selbst wenn was vernünftiges zurückkommen sollte, der JFrame auf dem Du diese Methode aufrufst ist vermutlich gar nicht sichtbar.
Gezeichnet wird nur innerhalb einer paintComponent() einer Komponente.

Eine Einführung dazu gibt's z.B. hier:
JavaInsel Graphikprogrammierung
 

TheDescent

Mitglied
Ok, Prinzipiell Verstanden, jedoch bekomm ichs in der umsetzung nicht hin, g müsste das graphic object sein, wird aber nicht erkannt, wäre es möglich das sich jemand erbarmt mir einen "korrigierten"
Quellcode zu geben? denke es wäre sehr hilfreich

Nochmals danke für die bisherige Hilfe



Java:
    robo =new Robutton(50,100);	
    coin = new Münze(100,200);	
	
    JPanel pan = new JPanel();
    pan.add(coin.paint(g));
    pan.add(robo.paint(g));
    pan.paintComponents(g);
    
    add(pan);
    setTitle("Robuttons");
    setSize(300,280);
    setDefaultCloseOperation(Tisch.EXIT_ON_CLOSE);
    setVisible(true);
    setResizable(true);
	
	}


	
	public void actionPerformed(ActionEvent p){
	
	repaint();
		
	
	}
 
S

SlaterB

Gast
das Prinzip ist wie mehrfach erwähnt, aus der überschriebenen paintComponent des Panels die paint-Methoden der anderen Objekte aufzurufen,
paintComponent hattest du doch bisher auch, das hängt doch mit repaint() und überhaupt allen g-Zeichen-Befehlen zusammen,
wie kannst du sagen, das verstanden zu haben aber dann diese zentrale Methode überhaupt nicht (mehr) verwenden?!

und Code-Befehle wie
> pan.add(coin.paint(g));
sind vollkommen ausgedachter Nonsens, dann sag doch einfach dass du noch nichts verstanden hast..

Java:
    robo =new Robutton(50,100); 
    coin = new Münze(100,200);  
    
    JPanel pan = new JPanel() { // anonyme Klasse oder wieder eine eigene neue Klasse definieren
       public void paintComponent(Graphics g) { 
           super.paintComponent(g); // immer gut

           coin.paint(g); // ganz einfach, als ständen die Zeichenbefehle hier, auf g des Panels irgendwas malen
           robo.paint(g);
       }
    };
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
I Scene Builder - mehrere Seiten AWT, Swing, JavaFX & SWT 6
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
temi JavaFX Mehrere Views mit Stage.setScene() oder mit Scene.setRoot()? AWT, Swing, JavaFX & SWT 7
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
T Swing Tetraeder - mehrere Punkte verbinden? - Ansätze gesucht AWT, Swing, JavaFX & SWT 2
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
F JavaFX Mehrere Stages "managen" AWT, Swing, JavaFX & SWT 2
r4w Changelistener auf mehrere Textfelder AWT, Swing, JavaFX & SWT 5
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
S Swing Mehrere Modal-Dialoge übereinander AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
C Java FX Warnmeldung: Mehrere Fonts gehören derselben Familie und Stil AWT, Swing, JavaFX & SWT 2
J Mehrere JInternalFrame; GetValues AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
KaffeeFan mehrere JTextField durchlaufen AWT, Swing, JavaFX & SWT 4
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
G JavaFX Menü und mehrere Scenes AWT, Swing, JavaFX & SWT 16
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
D Mehrere RadiButtons auswählar AWT, Swing, JavaFX & SWT 3
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
T JavaFX FXMLController für mehrere FXML? AWT, Swing, JavaFX & SWT 7
G mehrere Action-Abfolgen erfassen AWT, Swing, JavaFX & SWT 6
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
J Mehrere Hyperlinks "stilvoll" darstellen. AWT, Swing, JavaFX & SWT 1
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
S JavaFX Mehrere TreeTableView's synchron scrollen AWT, Swing, JavaFX & SWT 0
U Mehrere Oberflächeninstanzen seperat schließen AWT, Swing, JavaFX & SWT 5
J Rahmen um mehrere GUI Einzelteile AWT, Swing, JavaFX & SWT 2
S Layouts, mehrere Buttons nebeneinander AWT, Swing, JavaFX & SWT 2
M Mehrere Fenster innerhalb einer Application AWT, Swing, JavaFX & SWT 3
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
T [LWJGL] mehrere Displays? AWT, Swing, JavaFX & SWT 19
SexyPenny90 Mehrere Fenster AWT, Swing, JavaFX & SWT 2
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
O Swing JLabel mehrere Zeilen AWT, Swing, JavaFX & SWT 2
P mehrere Rectangles per JButton AWT, Swing, JavaFX & SWT 9
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
G Mehrere Layoutprobleme AWT, Swing, JavaFX & SWT 2
Kenan89 JTable mehrere ListSelections AWT, Swing, JavaFX & SWT 2
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
A mehrere Zeilen in GUi ausgeben AWT, Swing, JavaFX & SWT 2
N Mehrere Tasks nacheinander ausführen AWT, Swing, JavaFX & SWT 7
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
M 2D-Grafik Mehrere Linien (nacheinander) übereinander Zeichnen AWT, Swing, JavaFX & SWT 6
M Mehrere JPanel nacheinander?! AWT, Swing, JavaFX & SWT 11
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
K SWT Mehrere Einträge ins Clipboard legen AWT, Swing, JavaFX & SWT 2
C Swing Ein JFrame mehrere Ansichten AWT, Swing, JavaFX & SWT 8
C Swing Mehrere JSlider sollen aufeinander reagieren AWT, Swing, JavaFX & SWT 4
GUI-Programmer JFilechooser, mehrere Datein selektieren und Reihenfolge (2) AWT, Swing, JavaFX & SWT 8
S Mehrere JLists - Wie kennzeichnen? AWT, Swing, JavaFX & SWT 2
S Swing MVC Ein JFrame, mehrere JPanels AWT, Swing, JavaFX & SWT 6
J Mehrere JRadioButtons, aber nur 1 darf ausgewählt sein AWT, Swing, JavaFX & SWT 4
L Swing Mehrere Button die selbe Größe AWT, Swing, JavaFX & SWT 4
B AWT mehrere Fenster schließen AWT, Swing, JavaFX & SWT 8
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben