Zeichnung verschwindet hinter Bild

Status
Nicht offen für weitere Antworten.

_fabi

Aktives Mitglied
Hallo zusammen!

es ist schon sehr spät und ich komme grad einfach nicht mehr weiter...
Da ich noch nicht sehr bewandert im programmieren bin, werde ich jetzt mal ausführlich schreiben, was ich gemacht habe, weil ich keine Ahnung habe ob ich es so richtig gemacht habe oder nicht, bzw. was wichtig ist oder nicht.

ich habe mir eine eigene Klasse geschrieben, die einen Pfeil zeichnet (Array). dann habe ich im selben Projekt eine neue Klasse erstellt, die in einem Panel von einem Bild ausgefüllt wird, in einem anderen Panel Slider.
In die Pfeil-Klasse habe ich Methoden eingebunden, die den Ort, die Länge und die Farbe des Pfeils ändern können. Im fertigen Programm möchte ich einen Pfeil (Vektor) auf dem Bild haben den ich dann verschieben kann.
In der Hauptklasse habe ich also einen vectorT vom Typ Array initialisiert und lasse den über eine Paint-Funktion zeichnen.
Das Problem ist nur, dass ich den Pfeil nur so lange sehe, solange ich die Größe des Fensters ändere (manuell mit der Maus meine ich jetzt). Wenn ich die Maustaste loslasse, dann wird der Vektorpfeil von meinem Bild überzeichnet. Ich habe dann versucht in die paint-funktion einen repaint() einzubauen, aber das funktioniert nicht. Ich poste jetzt mal den gesamten Code, vll. ist für irgendjemanden der Fehler ja offensichtlich...


Code:
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.*;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import java.awt.event.*;



public class Tutoraufgabe extends JFrame implements ChangeListener //,ActionListener
 
{
	 /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	//Vektoren
	Arrow vectorT = new Arrow(100, 100, 10);
	
	//EinstellungsPanel
	JPanel settingsPanel = new JPanel();								//Panel für alle Einstellungen
																		//Ebene 1 Panel
																		//BorderLayout.EAST
	
	//SchlepperPanel			
	JPanel tractorPanel = new JPanel();									//Panel für alle Einstellungen des Traktors
																		//Ebene 2 Panel
	JLabel mlabelT = new JLabel("Traktor:");
	
	JPanel wheightPanelT = new JPanel();								//Panel für das Gewicht des Traktors
																		//Ebene 3 Panel
	JLabel wLabelT = new JLabel("Gewicht eingeben:");																		
	JTextField wTextT = new JTextField(7);								//Eingabefeld Gewicht
	int weightT;														//Gewicht des Schleppers
	
	JPanel positionPanelT = new JPanel();								//Panel für die Position des Schwerpunkts des Traktors
																		//Ebene 3 Panel
	JLabel pLabelT = new JLabel("Position einstellen:");
	JTextField outTextT = new JTextField(3);							//Anzeige des Sliders
	JSlider pSliderT = new JSlider										//Slider für die Position des Schwerpunkts des Traktors
					( SwingConstants.HORIZONTAL, 0, 100, 50 );			
	int positionT = 50;													//Position des Schwerpunkts des Traktors
	
	//HeckladerPanel			
	JPanel loaderPanel = new JPanel();									//Panel für alle Einstellungen der Ladevorrichtung
																		//Ebene 2 Panel
	JLabel mlabelL = new JLabel("Ladevorrichtung:");
	
	JPanel wheightPanelL = new JPanel();								//Panel für das Gewicht der Ladevorrichtung
																		//Ebene 3 Panel
	JLabel wLabelL = new JLabel("Gewicht eingeben:");																		
	JTextField wTextL = new JTextField(7);								//Eingabefeld Gewicht
	int weightL;														//Gewicht der Ladevorrichtung
	
	JPanel positionPanelL = new JPanel();								//Panel für die Position des Schwerpunkts der Ladevorrichtung
																		//Ebene 3 Panel
	JLabel pLabelL = new JLabel("Position einstellen:");
	JTextField outTextL = new JTextField(3);							//Anzeige des Sliders
	JSlider pSliderL = new JSlider										//Slider für die Position des Schwerpunkts der Ladevorrichtung
					( SwingConstants.HORIZONTAL, 0, 100, 50 );			
	int positionL = 50;													//Position des Schwerpunkts der Ladevorrichtung
	
	//GewichtPanel			
	JPanel matterPanel = new JPanel();									//Panel für alle Einstellungen des Materials
																		//Ebene 2 Panel
	JLabel mlabelM = new JLabel("Ladevorrichtung:");
	
	JPanel wheightPanelM = new JPanel();								//Panel für das Gewicht des Materials
																		//Ebene 3 Panel
	JLabel wLabelM = new JLabel("Gewicht eingeben:");																		
	JTextField wTextM = new JTextField(7);								//Eingabefeld Gewicht
	int weightM;														//Gewicht des Materials
	
	JPanel positionPanelM = new JPanel();								//Panel für die Position des Schwerpunkts des Materials
																		//Ebene 3 Panel
	JLabel pLabelM = new JLabel("Position einstellen:");
	JTextField outTextM = new JTextField(3);							//Anzeige des Materials
	JSlider pSliderM = new JSlider										//Slider für die Position des Schwerpunkts des Materials
					( SwingConstants.HORIZONTAL, 0, 100, 50 );			
	int positionM = 50;	
	
	//PicturePanel
	JPanel picturePanel = new JPanel();									//Panel für das Bild des Traktors
	JLabel pic = new JLabel(new ImageIcon("Traktor nur.jpg"));
	
	

	
	
	public Tutoraufgabe()
	{
		setTitle( "Tutoraufgabe 1: Traktor" );
	    setDefaultCloseOperation( EXIT_ON_CLOSE );
	    
	  
	    
	   pSliderT.setName("positionTractor");								//Slider für die Position des Schwerpunkts des Traktors 
	   pSliderT.setMajorTickSpacing(10);								//initialisieren
	   pSliderT.setMinorTickSpacing(2);									
	   pSliderT.setPaintTicks(true);
	   pSliderT.setPaintLabels(true);
	   pSliderT.setPreferredSize( new Dimension(250, 50));
	   pSliderT.addChangeListener( this );
	    
	   
	    wheightPanelT.add(wLabelT);										//Panel für das Gewicht des Traktors initialisieren
	    wheightPanelT.add(wTextT);
	    
	    positionPanelT.add(pLabelT);									//Panel für die Position des Schwerpunkts des Traktors 
	    positionPanelT.add(outTextT);									//initialisieren
	    positionPanelT.add(pSliderT);									
//	    vll noch eine Anzeige des aktuellen Werts einfügen
	    
	    tractorPanel.add(mlabelT);										//Panel 3. Ebene der 2. Ebene zufügen
	    tractorPanel.add(wheightPanelT);								
	    tractorPanel.add(positionPanelT);
	    tractorPanel.setLayout(new BoxLayout(tractorPanel, BoxLayout.Y_AXIS));
	    
	    loaderPanel.setBackground( Color.blue );
	    
	    settingsPanel.add(tractorPanel);								//Panel 2. Ebene der 1. Ebene zufügen
	    settingsPanel.add(loaderPanel);
	    settingsPanel.add(matterPanel);
	    settingsPanel.setLayout(new BoxLayout(settingsPanel, BoxLayout.Y_AXIS));
	    	    
	    
	    getContentPane().setBackground( Color.blue );					//ContentPane einrichten
	    getContentPane().setLayout( new BorderLayout() );
	    getContentPane().add(settingsPanel, BorderLayout.EAST);
	    getContentPane().add(pic, BorderLayout.CENTER);
	    
//	    vectorT.changePlace(100, 200);									//Vektoren initialisieren
//	    vectorT.changeLength(100);
//	    vectorT.changeColor(Color.red);
//	    vectorT.draw();
	    
	    
	    
	    
	    
	    
	    //Gewicht Hecklader
	    //Gewicht Last
	    
	   //listener method
	    
	    
	}
	
	public void paint ( Graphics gr )
	  { 
		setBackground(Color.black);
		
		vectorT.changePlace(100, 200);
		vectorT.changeLength(100);
		vectorT.changeColor(Color.red);
		vectorT.draw( gr );  
		
	  }

	
	public void stateChanged( ChangeEvent evt)
	    {
	    	JSlider source;
	    	source = (JSlider)evt.getSource();
	    	if (source.getName().equals("positionTractor"))
	    		{
	    		outTextT.setText( source.getValue() + " ");
	    		positionT = source.getValue();
	    		repaint();
	    		}
//andere Slider einfügen, vll auch mit switch/case
	    }
	
	public static void main( String[] args)
	{
			Tutoraufgabe traktor = new Tutoraufgabe() ;
//		    
//		    WindowQuitter wquit = new WindowQuitter(); 
//		    traktor.addWindowListener( wquit );
//		    
		    traktor.setSize( 200, 150 );     
		    traktor.setVisible( true );   

		    
	}	   
	
	public void actionPerformed( ActionEvent evt)  
	  {
	    
	    repaint();   
	  }
}
	
	class  WindowQuitter  extends WindowAdapter 
		{
		  public void windowClosing( WindowEvent e )
		  {
		    System.exit( 0 ); 
		  }
		}



Über Hilfe wäre ich sehr dankbar,





tut mir Leid, wenn ich mich blöd angestellt haben sollte!
Vielen Dank für eure Zeit,
lg Fabi


PS: darf man Klassen ohne import so einfach übernehmen, oder muss man da was machen?
PPS: kann ich den Pfeil auch irgendwie nur in ein Panel zeichnen?
 

hdi

Top Contributor
Also ich check bei deinem Code gar nix, du hast ja da zig Panels, wo malst du denn den Pfeil?
Und wo malst du das Bild?
Normalerweise zeichnet man in einem Panel, und nicht in einem JFrame.

Dein Problem wird wohl sein, dass er in der falschen Reihenfolge malt, also erst den Pfeil,
dann das Bild. Das musst du halt ändern, aber wie gesagt, ich blick da bei dir nicht durch...

Angenommen, du hast nur 1 Panel, und da malst du sowohl das bild als auch den Pfeil, dann machst du:

Code:
JPanel p = new JPanel(){
       @Override
       protected void paintComponent(Graphics g){
              super.paintComponent(g);
              // bild zeichnen
              // pfeil zeichnen
       }
}

Und dann ist dein Pfeil auch immer über dem Bild, weil er ja danach gemalt wurde.

Wenn ich dich nicht richtig verstehe, dann erklär bitte deinen Code mal genauer, also was da die einzelnen
Komponenten alle machen usw.
 

diggaa1984

Top Contributor
so auf den ersten blick würde ich auch denken das es daran liegt das du auf dem JFrame malst und nich auf dem panel .. das heisst, dein gemaltes wird von den panels überdeckt und is daher nicht sichtbar .. was auch bedeutet das dein "setBaackground(Color.black)" (oder so) .. keine auswirkungen zeigen sollte. einen schwarzen hintergrund dürftest du nie sehen, und es dürfte auch nicht dine panels löschen (zum neuzeichnen quasi).

alles was du in der paint-methode hast bezieht sich auf dein JFrame und nich auf ein Panel auf dem du malen willst.

.. seh grad du machst das Image per JLabel ... dafür kannst nun in der tat ein Panel verwenden und die paint-methode überschreiben wie mein vorrposter schon demonstriert hat.

vielleicht hilft ja auch ne skizze wie das mal aussehen soll mit den ganzen panelgeschichten, da kann man bestimmt optimieren, sprich panel-objekte sparen, ist sehr verwirrend .. die LayoutManager bieten da viele Möglichkeiten, auf den ersten blick nicht ganz leicht zu verstehen (zB GridBagLayout) aber durchaus sehr mächtig
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L zeichnung verschwindet nach komponenteneinfügung Java Basics - Anfänger-Themen 20
B Zeichnung auf dem Applet verschwindet Java Basics - Anfänger-Themen 13
H Zeichnung in Container Java Basics - Anfänger-Themen 8
J Java Array Zeichnung Skalieren und verschieben Java Basics - Anfänger-Themen 5
E Java Canvas Zeichnung Java Basics - Anfänger-Themen 2
S Über Button Zeichnung ändern Java Basics - Anfänger-Themen 5
J OOP GUI mit JTable und Zeichnung Java Basics - Anfänger-Themen 3
S Zeichnung der GUI kontrollieren Java Basics - Anfänger-Themen 9
R Zeichnung entfernen und neue Zeichnen lassen Java Basics - Anfänger-Themen 20
D Programm für Widestandsberechnung mit Zeichnung Java Basics - Anfänger-Themen 25
S Zeichnung drehen Java Basics - Anfänger-Themen 13
R BorderLayout macht meine Zeichnung kaputt Java Basics - Anfänger-Themen 14
J Mail body verschwindet Java Basics - Anfänger-Themen 2
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
E Quelltext für Grafik verschwindet Java Basics - Anfänger-Themen 9
S Grafik verschwindet Java Basics - Anfänger-Themen 8
S Enterzeichen \n verschwindet beim speichern in .txt Java Basics - Anfänger-Themen 5
Z Label verschwindet in JScrollPane Java Basics - Anfänger-Themen 7
H Diverse Dinge: Unstabile Grafik, Druckt Grafik nicht,Tooltipp verschwindet hinter Grafik Java Basics - Anfänger-Themen 3
J Cursor verschwindet Java Basics - Anfänger-Themen 2
M Label verschwindet? Java Basics - Anfänger-Themen 3
J Das Gezeichnete auf JPanel verschwindet nach minimize Java Basics - Anfänger-Themen 4
M bild verschwindet immer Java Basics - Anfänger-Themen 5
K Farbenspiel : Quadrat verschwindet,wenn Fenster inaktiv ist Java Basics - Anfänger-Themen 13
U JButton verschwindet Java Basics - Anfänger-Themen 7
R Appletinhalt verschwindet beim Resizen des Browserfensters Java Basics - Anfänger-Themen 8
S Grafik verschwindet aus JTabbedPane Java Basics - Anfänger-Themen 4
M In gleicher zeile hinter ausgabe noch etwas ausgeben Java Basics - Anfänger-Themen 1
S Was für Aufgaben könnten sich hier hinter verbergen? Java Basics - Anfänger-Themen 5
H Datentypen Was für eine Format verbirgt sich hinter dem Integer-Wert 053? Java Basics - Anfänger-Themen 2
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
A Konsolenausgabe: Hinter letztes Element ein "}" Java Basics - Anfänger-Themen 2
S Was bewirkt ganz genau throw hinter einem Funktionsnamen? Java Basics - Anfänger-Themen 14
A break; mit Einfluss hinter else if Block Java Basics - Anfänger-Themen 3
S HTML-Quelltext hinter HTTPS Java Basics - Anfänger-Themen 1
D Programm öffnet hinter Taskleiste Java Basics - Anfänger-Themen 1
Q Kommastellen hinter double wert entfernen Java Basics - Anfänger-Themen 5
X Klassen mit Suffix hinter @-Zeichen Java Basics - Anfänger-Themen 7
J Zeichen hinter Teilstring aus *txt lesen Java Basics - Anfänger-Themen 7
S Whois Abfrage hinter Proxy Java Basics - Anfänger-Themen 5
J Einen Wert hinter einen anderen speichern! Java Basics - Anfänger-Themen 2
D Datentypen Double 2 stellen hinter dem Komma ausgeben OHNE decimalformat Java Basics - Anfänger-Themen 2
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
G Vor oder hinter public static void main. ? Java Basics - Anfänger-Themen 8
T umgebungsvariable in xp setzen: hinter vorhandenen path? Java Basics - Anfänger-Themen 3
G Bild hinter TextArea Java Basics - Anfänger-Themen 2
S Technik hinter der write Methode Java Basics - Anfänger-Themen 5
G was steckt hinter jsp? Java Basics - Anfänger-Themen 9
K AWT: Punkt (0,0) hinter Titelzeile oder 'getTitelzeilenhöhe' Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben