Umgang mit der Update Methode

elochai

Mitglied
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 🙂
 
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
 
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.
Java:
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);
	}
}
 
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?? 🙂
 
Ok. Also ich hab mein Programm in View/Model/Controller aufgeteilt. Hier mal die Teilausschnitte der einzelnen Klassen:
Controller:
Java:
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:
Java:
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
Java:
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 🙁(
 
ah ok. stimmt. also ich hab in changePic() noch npic() hinzugefügt. Der Aufruf für pic geschieht über controller
Java:
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..
 
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.
 
ah ok. stimmt. also ich hab in changePic() noch npic() hinzugefügt. Der Aufruf für pic geschieht über controller
Java:
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..

Die Initialisierung dabei ist uninteressant. Du musst Dir ja in der
Code:
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?
 
Die Initialisierung dabei ist uninteressant. Du musst Dir ja in der
Code:
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?

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:
Java:
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);
   [...]
 
Du brauchst eine Membervariable von deinem JLabel und dann in der update Methode

myLabel.setImageIcon(model.getImage())

und nicht über das toolkit bilder laden
 
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? 🙂
 
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
 
Meinst du meine methode changePic() oder? wenn ja, dann weiß ich nicht genau wie ich das dann in der update() anstellen soll, weil mit
Java:
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()
Java:
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();
			
		}
 
Meinst du meine methode changePic() oder? wenn ja, dann weiß ich nicht genau wie ich das dann in der update() anstellen soll, weil mit
Java:
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()
Java:
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();
			
		}


Nein mein ich nicht
Java:
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
 
Java:
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
Java:
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?
 
Zuletzt bearbeitet:
Java:
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:
Java:
Model m = (Model) o;
olym.setIcon(m.getPic());
Ich nehme mal an das olym eine Referenz auf des JLabel enthält.
 
Ok. Also die update sieht jetzt so aus wie von dir beschrieben und die Model so:
Java:
 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
 
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 :
Java:
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?
 
Zuletzt bearbeitet:
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
 
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?
 
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?
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.
 
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 🙂
 
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.
 
Das hab ich auch gedacht. Aber ich habe
Java:
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?
 
ich habe mir jetzt mal jedes mal. bevor ich die Werte in dem Array änder, einen Wert davon ausdrucken lassen, also:
Java:
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??
 
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.
 
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?
 
Naja, ich versteh nicht wirklich was Du damit bezweckst. Hat das noch was mit der ursprünglichen Fragestellung zu tun?
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?
 
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 😉
 
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:
Code:
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();
 

Zurück
Oben