# Umgang mit der Update Methode



## elochai (26. Mai 2011)

Hallo
Ich arbeite erst seit kurzem mit Java Swing usw., also ist meine Frage wahrscheinlich ungenau gestellt und verwirrend 
Ich habe ein Programm welches mir über einen FileChooser ein Bild öffnen soll. Jedoch weiß ich nicht genau wie ich das Programm dann aktualisieren kann damit es mir mein Bild dann auch anzeigt. Dass muss doch bestimmt über die update Methode gehn ,welche ich von Observer überschreibe?
Ich hoffe ihr könnt mir helfen


----------



## Asgar13 (26. Mai 2011)

Funktioniert nicht repaint()?


----------



## elochai (26. Mai 2011)

Muss ich das in der update Methode aufrufen? Wenn ja, dann passiert bei screen.repaint() leider nichts. Screen ist mein JPanel in dem das Bild angezeigt werden soll


----------



## Michael... (26. Mai 2011)

Zeichnen in Swing funktioniert durch erben von JComponent oder JPanel und überschreiben der paintComponent(...). Um ein Bild zu zeichnen/wechseln image setzen und repaint() an der Komponente aufrufen.

```
class Scree extends JComponent {
	private BufferedImage image;
	
	...

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (image!=null)
			g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
	}
}
```


----------



## elochai (26. Mai 2011)

Ok. Ich hab mein Programm aber mit ImageIcon aufgebaut und würde das gerne belassen. Ich habe bis jetzt eine Methode, welche mir den Pfad der ausgewählten Datei als String zurückgibt. Diesen übergebe ich dann dem Konstruktor für ein neues ImageIcon also 
ImageIcon picture = new ImageIcon (""+pic);
Zuvor hatte ich statt dem String eine URL und das ging wunderbar. Aber ich denke dass ich jetzt doch bestimm das Prog i-wie aktualisiern muss damit es mit mein Bild anzeigt oder??


----------



## Michael... (26. Mai 2011)

elochai hat gesagt.:


> Ok. Ich hab mein Programm aber mit ImageIcon aufgebaut und würde das gerne belassen.


D.h. Du malst das Bild nicht selbst sondern verwendest es in einem JLabel, JButton oder sonstigem?
Zeig mal ein bisschen Code.

Ansonsten: Es gibt auch getImage(), um an das Image eines ImageIcons zu kommen.


----------



## elochai (27. Mai 2011)

Ok. Also ich hab mein Programm in View/Model/Controller aufgeteilt. Hier mal die Teilausschnitte der einzelnen Klassen:
Controller:

```
public void actionPerformed(ActionEvent e) {
		String cmd =  e.getActionCommand();
		/** 
		 * Bilder oeffnen
		 */
		if(cmd.equals("Load File")){
			loadFile();
	}}

private void loadFile() {
		JFileChooser chooser = new JFileChooser();
		int returnVal = chooser.showOpenDialog( null );
		if ( returnVal == JFileChooser.APPROVE_OPTION )
	    { mainModel.changePic(chooser.getSelectedFile().getPath());}
	}
```

Model:

```
public class Model extends Observable {
	public Image pic;
	public static String effekt;
	public static boolean newpic;
	public String filters;
	
	public static boolean npic(){	
		return newpic;
	}
	
	
		public void changePic(String a){
			effekt = a;
			pic  = Toolkit.getDefaultToolkit().getImage(a);
			setChanged();
			notifyObservers();
			
		}}
```

und View

```
public View(Controller mainController,String pic,String[] filt) {
    
    	
    this.setTitle("Medientechnik - " + "olympiazentrum.png");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    contentAll.setLayout(new BorderLayout());
    menueleiste.setLayout(new FlowLayout());
    screen.setLayout(new GridBagLayout());
    customize.setLayout(new FlowLayout());
    effects.setLayout(new BorderLayout());
	GridBagConstraints c = new GridBagConstraints();
	orig.setLayout(new BorderLayout());
	orig.setLayout(new BorderLayout());
        
	for(int i = 0; i<filt.length;i++){
		effekte = effekte + filt[i];
	}
	
    try {
    	
      ImageIcon olymp = new ImageIcon (""+pic);
      
      ImageIcon olymp2 = new ImageIcon(""+pic);[...]}}
[...]

@Override
public void update(Observable o, java.lang.Object obj) {
Model m = (Model) o;
if(Model.npic());

}
```

Es will mir einfach nichts aktualisieren (


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> und View
> [JAVA=29]if(Model.npic());
> 
> }[/code]


Und wo ist der Code mit dem Du das neue Bild in die View holst und in der View verwendest.
Liefert 
	
	
	
	





```
npic()
```
auch 
	
	
	
	





```
true
```
 wenn ein neues Bild geladen wurde? Sehe in den Codeausschnitten nirgends, dass es gesetzt wird.


----------



## elochai (27. Mai 2011)

ah ok. stimmt. also ich hab in changePic() noch npic() hinzugefügt. Der Aufruf für pic geschieht über controller 
	
	
	
	





```
public Controller() {
		
	mainModel = new Model();
	mainView = new View(this,pic,filters);
	mainModel.addObserver(mainView);
	mainView.setVisible(true);[...]
```
wobei ich mir nicht sicher bon ob das so richtig ist ???:L
achja und pic hab ich in controller als Klassenvariable mit einem anfangswert. Mir kommen immer mehr Zweifel auf..


----------



## Gast2 (27. Mai 2011)

1. würde ich Bilder NICHT über das Toolkit (alt und nicht Ressourcen schonend) laden.
2. Brauchst du irgendein widget (JPanel,JLabel usw.) wo du das Bild anzeigen lassen willst, hast du denn so ein widget? Im Code ist dazu nichts zu finden.


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> ah ok. stimmt. also ich hab in changePic() noch npic() hinzugefügt. Der Aufruf für pic geschieht über controller
> 
> 
> 
> ...



Die Initialisierung dabei ist uninteressant. Du musst Dir ja in der 
	
	
	
	





```
public void update(Observable o, java.lang.Object obj)
```
 die Referenz auf das neue Bild aus dem Model holen und dann auch irgendwo anzeigen lassen - siehe Anmerkungen von SirWayne.
Wie oder worauf werden denn die Bilder nach der Initialisierung also vor dem update angezeigt?


----------



## elochai (27. Mai 2011)

Michael... hat gesagt.:


> Die Initialisierung dabei ist uninteressant. Du musst Dir ja in der
> 
> 
> 
> ...



Wie ich das in der Update mache, weiß ich eben nicht genau.  Das Bild wird einem JLabel zugeordnet welches ein Teil eines JPanels ist. Hier mal der Code:

```
try {
    	
      ImageIcon olymp = new ImageIcon (""+pic);
      
      ImageIcon olymp2 = new ImageIcon(""+pic);
     
      float h= (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
      float w= (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
      float olymp_h= olymp.getIconHeight();
      float olymp_w= olymp.getIconWidth();
      //Berrechnet das Seitenverhältniss des Bildes fuer die Skalierung,im if-Fall. Double für praezisere Angaben
      float olymp_verh = olymp_w/olymp_h;
      float pic_resized_h = h/2;
      float pic_resized_w = (h/2)*olymp_verh;
      int res_w = (int) pic_resized_w;
      int res_h = (int) pic_resized_h;
      
      if(olymp_h>h || olymp_w >w/2){
      olymp.setImage(olymp.getImage().getScaledInstance(res_w,res_h,Image.SCALE_FAST)); 
      olymp2.setImage(olymp2.getImage().getScaledInstance(res_w,res_h,Image.SCALE_FAST));} 
      
      else {
          olymp.setImage(olymp.getImage().getScaledInstance((int)olymp_w,(int)olymp_h,Image.SCALE_FAST)); 
          olymp2.setImage(olymp2.getImage().getScaledInstance((int)olymp_w,(int)olymp_h,Image.SCALE_FAST));} 
      
      
    JLabel olym = new JLabel(olymp);
    JLabel olym2 = new JLabel(olymp2);
   [...]
```


----------



## Gast2 (27. Mai 2011)

Du brauchst eine Membervariable von deinem JLabel und dann in der update Methode

myLabel.setImageIcon(model.getImage())

und nicht über das toolkit bilder laden


----------



## elochai (27. Mai 2011)

Gut. Also ich habe mir jetzt eine Membervariable gemacht und der update() olym.setImageIcon(Model.getImage()); hinzugefügt. Jetzt muss ich mir noch die getImage in der Model schreiben richtig? Wie sollte ich Bilder laden, wenn nicht mit Toolkit?


----------



## Gast2 (27. Mai 2011)

elochai hat gesagt.:


> Gut. Also ich habe mir jetzt eine Membervariable gemacht und der update() olym.setImageIcon(Model.getImage()); hinzugefügt. Jetzt muss ich mir noch die getImage in der Model schreiben richtig? Wie sollte ich Bilder laden, wenn nicht mit Toolkit?



Ja bei dir würde es getPic() heißen...

Über ImageIO kannst du Bilder laden


----------



## elochai (27. Mai 2011)

Meinst du meine methode changePic() oder? wenn ja, dann weiß ich nicht genau wie ich das dann in der update() anstellen soll, weil mit 
	
	
	
	





```
olym.setImageIcon(Model.changePic());
```
 kommt, dass er ein String Argument erwartet, da diese Methode ja einen String braucht um mein Image zu erstellen. Und wenn ich ihm dann zum Test einen gebe, dann kommt dass er von einer statischen nicht auf eine nicht statische zugreifen kann. Hier meine changePic()
	
	
	
	





```
public void changePic(String a) throws IOException{
//			effekt = a;
//			pics  = Toolkit.getDefaultToolkit().getImage(a);
			File datei = new File( a );
			Image image = ImageIO.read( datei );
			setChanged();
			notifyObservers();
			npic();
			
		}
```


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> Meinst du meine methode changePic() oder?


Nein, das bezog sich vermutlich darauf, dass deine Methoden im Model alle ...Pic() heißen.

Gemeint war auch, auf das Label das neue ImageIcon zu setzen

```
myLabel.setIcon(model.getImageIcon());
```
nicht, das Image des bestehenden ImageIcons zu ändern.


----------



## Gast2 (27. Mai 2011)

elochai hat gesagt.:


> Meinst du meine methode changePic() oder? wenn ja, dann weiß ich nicht genau wie ich das dann in der update() anstellen soll, weil mit
> 
> 
> 
> ...




Nein mein ich nicht

```
public class Model extends Observable {
    public Image pic;
    public static String effekt;
    public static boolean newpic;
    public String filters;
    
    public static boolean npic(){   
        return newpic;
    }
    
    
        public void changePic(String a){
            effekt = a;
            pic  = Toolkit.getDefaultToolkit().getImage(a);
            setChanged();
            notifyObservers();
            
        }}
```
ein einfacher getter von pic reicht doch?!? getPic eben


----------



## elochai (27. Mai 2011)

```
public void update(Observable o, java.lang.Object obj) {
Model m = (Model) o;
olym.setIcon(Model.getPic());

}
```
so sieht jetzt meine update aus und so sieht der Teil meiner Model aus
	
	
	
	





```
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Observable;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class Model extends Observable {
	public static Image pics;
	public static String effekt;
	public static boolean newpic;
	public String filters;
	static Image image;
	public static boolean npic(){	
		return newpic;
	}
	
	public static  Image getPic(){
		return image;
		
	}
	
	
	
		public void changePic(String a) throws IOException{
//			effekt = a;
//			pics  = Toolkit.getDefaultToolkit().getImage(a);
			File datei = new File( a );
			this.image = ImageIO.read( datei );
			
			setChanged();
			notifyObservers();
			npic();
			
		}
```
für setIcon caste ich das Image dann zu Icon. Wenn ich das Prog dann ausführe kommt aber, wenn ich auf den "Open" Button klick ein "unknown source" Fehler bzw. BufferedImage cannot be cast to Icon. Liegt das an der read() methode?


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> ```
> public void update(Observable o, java.lang.Object obj) {
> Model m = (Model) o;
> olym.setIcon(Model.getPic());
> ...


Die Methode getPic() bitte nicht static machen und auch nicht an der Klasse, sondern an der jeweiligen Instanz aufrufen:

```
Model m = (Model) o;
olym.setIcon(m.getPic());
```
Ich nehme mal an das olym eine Referenz auf des JLabel enthält.


----------



## Michael... (27. Mai 2011)

Um aus einem Image ein ImageIcon zu machen:

```
new ImageIcon(image)
```


----------



## elochai (27. Mai 2011)

Ok. Also die update sieht jetzt so aus wie von dir beschrieben und die Model so:

```
public class Model extends Observable {
	public  Image pics;
	public static String effekt;
	public static boolean newpic;
	public String filters;
	 Image image;
	public static boolean npic(){	
		return newpic;
	}
	
	public  Icon getPic(){
		Icon im = (Icon) image;
		
		return im;
		
	}
	
		public void changePic(String a) throws IOException{
//			effekt = a;
//			pics  = Toolkit.getDefaultToolkit().getImage(a);
			File datei = new File( a );
			this.image = ImageIO.read( datei );
			
			setChanged();
			notifyObservers();
			npic();
			
		}
```
es kommt aber beim öffnen Versuch immer der Fehler, dass man nicht von BufferedImage zu Icon casten kann


----------



## Gast2 (27. Mai 2011)

Du sollst auch nicht casten.


----------



## elochai (27. Mai 2011)

Aber setIcon() verlangt doch nach einem Icon?


----------



## Michael... (27. Mai 2011)

Michael... hat gesagt.:


> Um aus einem Image ein ImageIcon zu machen:
> 
> ```
> new ImageIcon(image)
> ```


Ein Image ist kein ImageIcon, deshalb kann man hier auch nicht casten


----------



## elochai (27. Mai 2011)

Juhu. Endlich ein Erfolgserlebnis  Danke Jetzt hab ich aber ein neues Problem und zwat erstreckt sich das Pic jetzt über das ganze Frame und verdeckt meine Editleiste am unteren Bildrand. Woran kann das liegen? Hier mal der Code der ganzen View zur Hilfe :

```
package Blatt1;

import javax.swing.*;

import org.omg.CORBA.Object;

import java.awt.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Observable;
import java.util.Observer;

public class View extends JFrame implements Observer {

    JPanel contentAll = new JPanel();
    JPanel menueleiste = new JPanel();
    JPanel screen = new JPanel();
    JPanel effects = new JPanel();
    JPanel customize = new JPanel();
	JLabel orig = new JLabel("Original");
	JLabel prev = new JLabel("Preview");
	String effekte = "";
	//String bild = "http://www.blacksins.de/sites/default/files/band_bilder/disturbed.jpg";
	JLabel olym;
	JLabel olym2;
	JTextField filter;
    public View(Controller mainController,String pic,String[] filt) {
    
    	
    this.setTitle("Medientechnik - " + "olympiazentrum.png");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    contentAll.setLayout(new BorderLayout());
    menueleiste.setLayout(new FlowLayout());
    screen.setLayout(new GridBagLayout());
    customize.setLayout(new FlowLayout());
    effects.setLayout(new BorderLayout());
	GridBagConstraints c = new GridBagConstraints();
	orig.setLayout(new BorderLayout());
	orig.setLayout(new BorderLayout());
        
	for(int i = 0; i<filt.length;i++){
		effekte = effekte + filt[i];
	}
	
    try {
    	
      ImageIcon olymp = new ImageIcon (""+pic);
      
      ImageIcon olymp2 = new ImageIcon(""+pic);
     
      float h= (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
      float w= (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
      float olymp_h= olymp.getIconHeight();
      float olymp_w= olymp.getIconWidth();
      //Berrechnet das Seitenverhältniss des Bildes fuer die Skalierung,im if-Fall. Double für praezisere Angaben
      float olymp_verh = olymp_w/olymp_h;
      float pic_resized_h = h/2;
      float pic_resized_w = (h/2)*olymp_verh;
      int res_w = (int) pic_resized_w;
      int res_h = (int) pic_resized_h;
      
      if(olymp_h>h || olymp_w >w/2){
      olymp.setImage(olymp.getImage().getScaledInstance(res_w,res_h,Image.SCALE_FAST)); 
      olymp2.setImage(olymp2.getImage().getScaledInstance(res_w,res_h,Image.SCALE_FAST));} 
      
      else {
          olymp.setImage(olymp.getImage().getScaledInstance((int)olymp_w,(int)olymp_h,Image.SCALE_FAST)); 
          olymp2.setImage(olymp2.getImage().getScaledInstance((int)olymp_w,(int)olymp_h,Image.SCALE_FAST));} 
      
      
     this.olym = new JLabel(olymp);
    this.olym2 = new JLabel(olymp2);
   
    c.gridx = 0;
    c.gridy= 0;
    c.gridwidth=3;
    screen.add(olym,c);
    
    c.gridx= 3;
    c.gridy=0;
    c.gridwidth=3;
    screen.add(olym2,c);
    
    c.gridx=2;
    c.gridy=1;
    screen.add(orig,c);
    
    c.gridx=4;
    c.gridy=1;
    screen.add(prev,c);
    
    } catch (NullPointerException e) {
          e.printStackTrace();
    }

    JMenuBar menuBar = new JMenuBar();
    JMenu file = new JMenu("File");
    JMenu filters = new JMenu("Filters");
    JMenu about = new JMenu("About");
    JMenuItem loadfile = new JMenuItem("Load File");
    JMenuItem exit = new JMenuItem("Exit");
    JMenuItem aboutMedientechnik = new JMenuItem("About Medientechnik");
    JCheckBoxMenuItem blur = new JCheckBoxMenuItem("Blur");
    JCheckBoxMenuItem disort = new JCheckBoxMenuItem("Disort");
    JCheckBoxMenuItem sharpen = new JCheckBoxMenuItem("Sharpen");
    JCheckBoxMenuItem contrast = new JCheckBoxMenuItem("Contrast");
    JRadioButton allEffects = new JRadioButton("Alle Effekte");
    allEffects.setActionCommand("Alle Effekte");
    allEffects.addActionListener(mainController);
    this.filter = new JTextField(effekte);
    JButton random = new JButton("Random");
    random.setActionCommand("Random");
    random.addActionListener(mainController);
    JSeparator separator = new JSeparator();
    
    blur.setState(false);
    disort.setState(false);
    sharpen.setState(false);
    contrast.setState(false);
   
    filters.add(blur);
    blur.setActionCommand("blur");
    blur.addActionListener(mainController);
    filters.add(disort);
    disort.setActionCommand("disort");
    disort.addActionListener(mainController);
    filters.add(sharpen);
    sharpen.setActionCommand("sharpen");
    sharpen.addActionListener(mainController);
    filters.add(contrast);
    contrast.setActionCommand("contrast");
    contrast.addActionListener(mainController);
    file.add(loadfile);
    loadfile.setActionCommand("Load File");
    loadfile.addActionListener(mainController);
    file.add(exit);
    exit.setActionCommand("Exit");
    exit.addActionListener(mainController);
    
    filters.add(filters);
    menuBar.add(file);
    menuBar.add(filters);
    menuBar.add(about);
    about.add(aboutMedientechnik);
    aboutMedientechnik.setActionCommand("About Medientechnik");
    aboutMedientechnik.addActionListener(mainController);  

    customize.add(allEffects, FlowLayout.LEFT);
    customize.add(random, FlowLayout.CENTER);
    customize.add(filter, FlowLayout.RIGHT);
    customize.add(new JLabel("Filters: "), FlowLayout.RIGHT);
    effects.add(separator, BorderLayout.NORTH);
    effects.add(customize, BorderLayout.SOUTH);
    
    contentAll.add(screen, BorderLayout.NORTH);
    contentAll.add(effects, BorderLayout.SOUTH);

    this.setJMenuBar(menuBar);
    this.setContentPane(contentAll);
    this.setResizable(false);
    this.pack();
    this.setVisible(true);
    
  }

@Override
public void update(Observable o, java.lang.Object obj) {
Model m = (Model) o;
olym.setIcon(m.getPic());

olym2.setIcon(m.getPic());
filter.setText(m.filters);

}

  
}
```

hab gesehn er resized die Bilder nicht. Jetzt muss ich das auch noch i-wie in die Update bekommen oder?


----------



## elochai (27. Mai 2011)

Das resize Problem konnte ich jetzt lösen, ABER jetzt hab ich ein anderes Problem. Und zwar kann ich alle andere Aktionen des Programms( zum Beispiel das Einblenden eins Infofensters) erst ausführen, nachdem ich ein Bild geladen habe. Vorher bekomm ich eine NullPointerException. Wieso ist das so?????:L


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> Vorher bekomm ich eine NullPointerException. Wieso ist das so?????:L


Weil eine Variable nicht initialisiert ist bzw. auf kein Objekt referenziert.
In der Fehlermeldung steht übrigens die Zeilennummer, in der die NPE auftritt. Mindestens eines der in dieser Zeile verwendeten Objekt "ist" dann null.


----------



## elochai (27. Mai 2011)

ok. Das funktioniert jetzt. Ich habe jetzt noch ein letztes Problem. Wäre super wenn ihr mir da helfen könntet. Ich will dafür nicht extra n neues Thema aufmachen 
Und zwar hab ich diverse Buttons und ein Textfeld. In dem Textfeld soll erscheinen, was welcher von den Buttons aktiv ist. Soweit kein Problem. Aber wie bekomm ich das aus dem Textfeld wieder raus, wenn ich die Buttons wieder deaktiviere?`Wahrscheinlich muss die actionListener überprüfen ob getState() von den Buttons true ist. Aber wie kann ich von der Controller aus einen Wert in meiner View überprüfen?


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> In dem Textfeld soll erscheinen, was welcher von den Buttons aktiv ist. Soweit kein Problem. Aber wie bekomm ich das aus dem Textfeld wieder raus, wenn ich die Buttons wieder deaktiviere?`Wahrscheinlich muss die actionListener überprüfen ob getState() von den Buttons true ist.


Die Info welcher Button (nehme mal an RadioButton) aktiv ist, kannst Du im Textfeld anzeigen lassen und wenn sie deaktiviert sind nicht?? Du reagierst doch sicherlich mit einem Listener auf den Statuswechsel - also sowohl beim Aktivieren als auch beim Deaktivieren?


elochai hat gesagt.:


> Aber wie kann ich von der Controller aus einen Wert in meiner View überprüfen?


Hört sich für mich so an, dass Du das MVC noch nicht wirklich verstanden hast: Lesen, Lesen, Lesen ;-)

Wenn das eine reine View interne Sache ist, ist der Weg über den Controller sowieso unnötig, wenn nicht sogar falsch.


----------



## elochai (27. Mai 2011)

sorry. Das war eine  bischen blöde Frage, ja. Aber jetzt bin ich fast fertig . Jetzt müsste ich nur noch wissen, wie ich dem Programm sagen kann, dass es bei dem Aufruf einer Methode zuerst wartet bis diese Methode ausgeführt ist bevor es weitermacht, denn im nächsten Schritt änder ich die Werte welche ich für die Methode brauch. Bitte sagt mir, dass dies ohne Thread geht


----------



## Michael... (27. Mai 2011)

elochai hat gesagt.:


> Jetzt müsste ich nur noch wissen, wie ich dem Programm sagen kann, dass es bei dem Aufruf einer Methode zuerst wartet bis diese Methode ausgeführt ist bevor es weitermacht, denn im nächsten Schritt änder ich die Werte welche ich für die Methode brauch,


Eventuell verstehe ich die Frage falsch. Code wird immer sequentiell abgearbeitet, sofern er im selben Thread ausgeführt wird.
Wenn eine Methode ausgeführt wird, wird diese gundsätzlich zuerst abgearbeitet, bevor zum nächsten Schritt übergegangen wird.


----------



## elochai (28. Mai 2011)

Das hab ich auch gedacht. Aber ich habe 
	
	
	
	





```
public void activatingAllEffects(){
		activatedFiltersCheck();
		filters[0]="Blur ";
		filters[1]="Disort ";
		filters[2]="Sharpen ";
		filters[3]="Contrast ";
		mainModel.filters(filters);
		mainView.blur.setState(true);
		mainView.disort.setState(true);
		mainView.sharpen.setState(true);
		mainView.contrast.setState(true);
	}
```
die activatedFiltersCheck() testet ob die 4 Buttons gerade aktiviert sind und bildet ein boolean Array.Für die Überprüfung checkt es ein Stringarray in welches der Name des Buttons eingetragen wurde, falls er gerade aktiv ist. Wenn ich dann in einem der Schritte nach der activatedFiltersCheck() den String ändere( welche den Wert im Strinarray ändert mit dem acitvatedFiltersCheck arbeitet), dann ist die Adresse immernoch false, wenn ich sie aufrufe. Ohne Veränderung ist alles true. Obwohl ich dass Array mit 4x false initialisiert habe. Logikfehler?


----------



## elochai (28. Mai 2011)

ich habe mir jetzt mal jedes mal. bevor ich die Werte in dem Array änder, einen Wert davon ausdrucken lassen, also:

```
public void activatingAllEffects(){
		activatedFiltersCheck();
		System.out.println(""+filters[0]);
		filters[0]="Blurj ";
		filters[1]="Disort ";
		filters[2]="Sharpen ";
		filters[3]="Contrast ";
		mainView.blur.setState(true);
		mainView.disort.setState(true);
		mainView.sharpen.setState(true);
		mainView.contrast.setState(true);
		mainModel.filters(filters);}
```
filters ist initialisiert mit String[] filters= {"","","",""}.
So. Dennoch druck das Programm mir "Blurj " aus. Egal wie ich filters[0] veränder nach der sysout methode, er druck mir den Wert aus, der erst nach dem sysout Aufruf gesetzt wurde. Also läuft dass doch nicht ganz sequentiell oder??


----------



## Michael... (28. Mai 2011)

Anhand des Codes kann man nicht viel sagen. Sieht aber für das was Du vermutlich vorhast recht merkwürdig aus. Du willst doch nur den Status von bestimmten Objekten überprüfen und daraus entsprechende Aktionen ableiten?

Definitiv wird Code (sofern im selben Thread) Zeile für Zeile abgearbeitet. Lass das Programm doch mal im Debug Modus durchlaufen, dann siehst Du wie und was im Code passiert.


----------



## elochai (28. Mai 2011)

Warum merkwürdig? Ich speicher die vorherigen Werte in einem boolean Array bevor ich sie veränder. Und später ersetze ich sie wieder durch die gespeicherten Werte. Wie könnte ich das besser machen?


----------



## Michael... (28. Mai 2011)

Naja, ich versteh nicht wirklich was Du damit bezweckst. Hat das noch was mit der ursprünglichen Fragestellung zu tun?


elochai hat gesagt.:


> Und zwar hab ich diverse Buttons und ein Textfeld. In dem Textfeld soll erscheinen, was welcher von den Buttons aktiv ist. Soweit kein Problem. Aber wie bekomm ich das aus dem Textfeld wieder raus, wenn ich die Buttons wieder deaktiviere?


----------



## elochai (28. Mai 2011)

Also ich habe ein Textfeld, in dem die Namen der aktivierten Buttons erscheint. Wenn ich nun den Button drücke um alle Buttons zu aktivieren und somit alle im textfeld anzuzeigen, dann soll er die buttons speichern, welche vorher schon aktiviert waren um diese nachdem deaktivieren des "alleButtons"-Button diese weiterhin aktiv zu lassen und im Textfeld anzuzeigen. 
Das hat zwar nichts mehr mit der ursprünglichen Fragestellung zu tun aber, wie oben beschrieben, wollte ich dafür nicht einen extra Thread eröffnen


----------



## Michael... (28. Mai 2011)

Und deshalb das String Array? Nimm doch einfach ein boolean Array. Weiss zwar immer noch nicht von welchen Buttons Du redest. Aber die Buttons würde ich dann ebenfalls in ein Array stecken.

Prinzipiell:

```
Button[] button = new WasAuchImmerFuerEinButton[4];
boolean[] buttonStatus = new boolean[button.length];
...
//"Aktiviere Alle - Button" wird gedrückt
for (int i=0; i<button.length; i++)
     buttonStatus[i] = button[i].istAktivOderSelektiert();
aktualisiereTextFeld();
...
//"Aktiviere Alle - Button" wird deaktivier
for (int i=0; i<button.length; i++)
    button[i].setAktiv(buttonStatus[i];
aktualisiereTextFeld();
```


----------

