Problem bei Textänderung eines JLabels

Status
Nicht offen für weitere Antworten.

bernds

Mitglied
Hallo,

ich habe folgendes Problem und komm einfach nicht weiter. Ich nutze einen JSlider um eine Variable einer Rechenoperation zu verändern und habe dem Slider einen ChangeListener hinzugefügt, so dass bei einem "Slide" die Berechnung neu durchgeführt wird und der Text (das Ergebnis) auf einem JLabel dargestellt wird. Natürlich immer das aktuelle Ergebnis. ;-)

Code:
anzSlider.addChangeListener(new ChangeListener() {
		    public void stateChanged(ChangeEvent e) {		    			    			    			    			    			    			    			    	
		    	ergBelastung.setText(String.valueOf(anzSlider.getValue()));		    	
		       }
		    });

Das Problem ist nun Folgendes:

Der JSlider und auch das JLabel liegen auf einem JPanel, welches ich wie folgt zusammenbaue:

Code:
public class MyPanel extends AbstractPanel {
...
public MyPanel() {
		panel = this.createBasicPanel();
                panel.add(label);
                panel.add(anzSlider);

Code:
public class AbstractPanel extends JPanel {
private static final long serialVersionUID = 6037839843943297109L;

	private Image image;
		
	public AbstractPanel() {}
		
	public AbstractPanel (Image file) {	    
		this.image = file;
	    repaint();
	}
	public AbstractPanel (String file) {		
		try {			
			URL url = getClass().getClassLoader().getResource( file );												
			image = ImageIO.read(url); 
		} catch (IOException e) {					
			e.printStackTrace();
		}		  
    }

	public void paintComponent(Graphics g) {  			
		if (image != null) {			 									
			super.paintComponent(g);
			int width = getWidth();			
	        int height = getHeight();	        
	        int imageWidth = image.getWidth(this);
	        int imageHeight = image.getHeight(this);
			int x = (width - imageWidth)/2;			
	        int y = (height - imageHeight)/2;	        
			g.drawImage(image, 0, 0, 500, 400, this);
    }
    } 
	
	/*protected JPanel createBasicPanel() { 		 						
 		JPanel parent = this; 		
 		parent.setOpaque(true);
 		JPanel frame = new JPanel();
 		frame.setOpaque(true);
 		frame.setLayout(new BorderLayout());
 		parent.add(BorderLayout.CENTER, frame);
 		frame.setBorder(new EmptyBorder(30, 30, 30, 30)); 		 		
 		return frame; 		
 	}*/
	
	protected JPanel createBasicPanel() { 		 						
 		JPanel parent = this; 		
 		parent.setOpaque(true); 		
 		parent.setLayout(new BorderLayout()); 		
 		parent.setBorder(new EmptyBorder(30, 30, 30, 30)); 		 		
 		return parent; 		
 	}
}

In der Klasse AbstractPanel überschreibe ich ja die Methode paintComponent, um ein Hintergrundbild auf dem Panel anzeigen zu können, oder auch nicht. Dies funktioniert jedoch nicht, wenn ich die im obigen Code auskommentierte Methode createBasicPanel() verwende, auf welcher ein zusätzliches Panel liegt welches auch zurückgegeben wird.
Nehme ich die nicht auskommentierte Methode und verzichte auf das zusätzliche Panel, kann ich so kann ich das Hintergrundbild problemlos hinzufügen. Jedoch passiert nun die große Katastrophe. Führe ich Berechnungen durch und ich setzte das neue Ergebnis mit panel.setText("ERGEBNIS"); wird der vorherige Wert nicht mehr gelöscht. Es sieht dann so aus, als ob alle vorherigen und das neue Ergebnis übereinander stehen... Folglich erkennt man nichts mehr.

Weiß jemand Rat?

Danke
 
Hallo,

leider klappt das nicht bzw. mag schon klappen, nur wird auch hier das Hintergrundbild nicht angezeigt meine eigene paintComponent() Methode des parent Panels nie aufgerufen wird.

Kann ich das ändern?

Dennoch schonmal danke.
 
Bist Du sicher, dass diese Methode this zurück geben soll? Der Name lässt was anderes vermuten...
Code:
protected JPanel createBasicPanel() {                           
   JPanel parent = this;        
   parent.setOpaque(true);        
   parent.setLayout(new BorderLayout());        
   parent.setBorder(new EmptyBorder(30, 30, 30, 30));               
   return parent;        
}

Ebenius
 
Meiner Meinung nach schon, da ich die Klasse AbstractPanel ja von JPanel ableite. Somit müsste das doch this sein, oder?
 
Hmm. Dein zweiter Code-Schnipsel zeigt:
Code:
public MyPanel() { 
      panel = this.createBasicPanel(); 
                panel.add(label); 
                panel.add(anzSlider);

Das ist dann also das gleiche wie:
Code:
public MyPanel() { 
      panel = this.createBasicPanel(); 
                this.add(label); 
                this.add(anzSlider);

Falls das tatsächlich beabsichtigt sein sollte, ist Deine Methoden-Benennung mehr als ungünstig. Von einer createXXX()-Methode erwarte ich, dass eine Instanz erzeugt wird. Ganz sicher sollte eine solche Methode im Regelfall nicht this zurück liefern.

Kannst Du evtl. ein (ggf. abgespecktes) kompilierbares Programm posten, das Dein Problem beinhaltet? Dann kann ich gern weiter schauen.

Grüße, Ebenius
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben