Grafiken/ImageIcon setzen

Status
Nicht offen für weitere Antworten.

stetabar

Bekanntes Mitglied
ich hab ein ImageIcon das am Anfang Deklariert wird

Code:
ImageIcon Akt = new ImageIcon("1.gif");

und in der paint() gezeichnet wird

Code:
Akt.paintIcon(this,g,277,426);

jetzt die Frage:

will in einer switch-case Anweisung je nach Inhalt das gif ändern, aber ohne einen repaint(),
da dabei die Textfelder zerschossen werden...

damit geht es nicht:
Code:
Akt = new ImageIcon("2.gif");

oder mit .setImage

jemand noch ne Idee, wie man das Lösen könnte?

Danke
 
es liegen textfelder auf einer grafik, die mit

Code:
super.paintComponents(g);

aufgerufen werden.
ich kann so auch ohne Probleme den Ihnalt der Textfelder ändern.
Allerdings gibt es auch eine Grafik, die geändert werden müsste...

Sobald ich aber repaint() ausführe, werden die Textfelder von der Grafik überlappt.

PS: bitte keine aussage darüber, dass man das vielleicht anders legen sollte...
soll so sein! 😉
 
in wie fern?

also wenn ich die

Code:
super.paintComponents(g);

als letztes zeichnen lasse, geht das, oder wie?
 
wenn ich die
Code:
super.paintComponents(g);
also letztes zeichnen lasse, dann gibt es nur noch die textfelder, aber nicht mehr die Grafiken...
 
Die Komponente die als letztes gezeichnet wird ist auch ganz oben.
Weiß jetzt nicht so genau wie das bei dir aussieht, also versuchs doch einfach mal :wink:
 
das sieht so aus:

Code:
public void init(){ 
       
      Container hintergrundContainer = getContentPane(); 
      hintergrundContainer.setBackground(backCOLOR); 
      hintergrundContainer.setLayout(null); 
       
      tempAkt = new JTextField(tempAktVar); 
      tempAkt.setEditable(false); 
      tempAkt.setHorizontalAlignment(JTextField.RIGHT); 
      tempAkt.setFont(new Font("Arial",Font.BOLD, 14)); 
      tempAkt.setBorder(null); 
      tempAkt.setBounds(118,337,68,25); 

      hintergrundContainer.add(tempAkt); 
} 
       
public void paint(Graphics g){ 
      super.paintComponents(g); 
      back.paintIcon(this,g,0,0); 
      Akt.paintIcon(this,g,277,426); 
} 

public void actionPerformed(ActionEvent e) { 
       
      Daten d = new Daten(); 
      directAktVar = d.getDirect(); 
      switch (directVar){ 
      case 1: 
         Akt = new ImageIcon("1.gif"); 
         repaint(); 
         break; 
      case 2: 
         Akt = new ImageIcon("2.gif"); 
         repaint(); 
         break; 
      } 
      this.tempAkt.setText(d.getTemp()); 
       
}

habs jetzt halt nur ohne Delkaration gemacht...
aber sollte klar werden, was ich will...


beim Start werden mir die JTextFields angezeigt (mit Ihnalt!!!)
beim repaint() allerdings nicht mehr.
Da sieht man sie nur noch, wenn man darauf klickt...
 
Mich überrascht ein bisschen das beim start das Textfeld überhaupt sichtbar ist, da du
offensichtlich als letztes die Bilder zeichnest. Wie gesagt: dreh's mal rum
 
hab jetzt gerade was rausgefunden.
also die reihenfolge muss so sein, da ich die Komponenten als "super" zeichne...
damit haben die wohl ne andere Stellung.
weiß nich genau...
naja, auf jeden fall kann ich, sobald ich nen button drücke was anzeigen lassen in den Textfeldern.
Heißt, dass alles richtig ist, aber leider der Inhalt, der auch in der " actionPerformed" aktualisiert wird,
wohl vor der repaint() Anweisung kommt. Und das, obwohl ich ja die Anweisung danach stehen habe...

kann ich das mit ner Verzögerung machen???
 
stetabar hat gesagt.:
hab jetzt gerade was rausgefunden.
also die reihenfolge muss so sein, da ich die Komponenten als "super" zeichne...
damit haben die wohl ne andere Stellung.

hab zwar keine Ahnung was du meinst, aber versuch dann mal folgendes:


Code:
public void actionPerformed(ActionEvent e) { 
        
      Daten d = new Daten(); 
      directAktVar = d.getDirect(); 
      switch (directVar){ 
      case 1: 
         Akt = new ImageIcon("1.gif"); 
         repaint(); 
         break; 
      case 2: 
         Akt = new ImageIcon("2.gif"); 
         repaint(); 
         break; 
      } 

        
       SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                
                  this.tempAkt.setText(d.getTemp()); 
            }
        });
}
 
id das ne inner class?
muss ich da dann auch nochmal alles deklarieren?

naja, was ich eben sagen wollte ist, dass ich in der actionPreformed Methode die Grafiken und der Textfield Inhalt neu gesetzt werden.

Code:
public void actionPerformed(ActionEvent e) { 
        
      Daten d = new Daten(); 
      directAktVar = d.getDirect(); 
      switch (directVar){ 
      case 1: 
         Akt = new ImageIcon("1.gif"); 
         repaint(); 
         break; 
      case 2: 
         Akt = new ImageIcon("2.gif"); 
         repaint(); 
         break; 
      } 
      this.tempAkt.setText(d.getTemp()); 
        
}

wenn ich über nen Button nur den Inhalt des Textfields nach dem repaint() änder, ist es ok...

Code:
public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() instanceof JButton){
			this.tempAkt.setText("Test");
		}
}

also Zeitablauf:

1. automatisches Update mit repaint()
grafiken werden angezeigt, aber textfield inhalte nur nach draufklicken!
2. button drücken
das textfield ist mit dem inhalt "test" sichtbar

jetzt die frage, da das problem ja anscheinend daran liegt, dass diese aktualisierung der textfields nicht erst ausgeführt werden nachdem die repaint() (bzw der seitenaufbau) fertig ist, sondern fast zeitgleich...
sonst würde der buttontest ja auch nichts zeigen...
 
Ich bin immernoch der meinung dass das bei dir falschrum ist, aber mit invokeLater kannst du eine Verzögerung
einbauen. Vieleicht gehts dann.
stetabar hat gesagt.:
id das ne inner class?
muss ich da dann auch nochmal alles deklarieren?
Ja, ist ne inner class
tempAkt ist ja eh eine Klassenvariable, müsste also reichen wenn du 'd' final machst.
 
das mit dem final hab ich jetzt nicht ganz verstanden.
muss ich in der deklaration die variable final machen?

was bedeutet final? *schäm* 😳
 
kurze zwischenfrage: wieso ist deine zeichnung eigentlich auf der gleichen compnent wie die swing komponenten?
 
Code:
public void actionPerformed(ActionEvent e) { 
        
      final Daten d = new Daten(); 
      directAktVar = d.getDirect(); 
      switch (directVar){ 
      case 1: 
         Akt = new ImageIcon("1.gif"); 
         repaint(); 
         break; 
      case 2: 
         Akt = new ImageIcon("2.gif"); 
         repaint(); 
         break; 
      } 

        
       SwingUtilities.invokeLater(new Runnable() 
        { 
            public void run() 
            { 
                
                  this.tempAkt.setText(d.getTemp()); 
            } 
        }); 
}
final macht d unveränderlich. probiers mal aus, und sag mir was passiert.
 
also er gibt keinen fehler mehr, wegen der Variablen, die aus der anderen classe geholt werden.
aber er bekommt keinen zugriff auf die Textfelder...

Code:
cannot resolve symbol
symbol: variable airAkt 
                                this.tempAkt.setText(d.getTemp());

dafür auch noch ne idee?
 
Code:
cannot resolve symbol 
symbol: variable airAkt 
                                this.tempAkt.setText(d.getTemp());
Wo ist den der Fehler? in dem code seh ich kein airAkt?
 
ah, sorry, hab den falschen fehler per C&P genommen... 😉
denk dir für das "airAkt" "tempAkt"!
hatte eben zu viel kopiert und falsch gelöscht.
sorry
 
jetzt hab ich was neues gelernt :### , aber das problem leider nicht lösen können... 🙁

letzte Möglichkeit, die ich noch sehe ist, dass ich mit 2 Timern arbeite und einer Zeitversetzt diese Textfelderinhalte schreibt...
 
das Problem ließ sich ganz einfach durch transparente Gifs lösen!
die Stellen, wo TextFields waren, habe ich ausgeschnitten und es lief...
danke an Wildcard für die Hilfe!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben