Klassen Klassenübergreifend ändern

Helgon

Bekanntes Mitglied
Hey, ich hab noch paar kleine Verständnis Probleme. Vielleicht könnt ihr mich kurz erleuchten :)

Ich hab mir ein GUI in Netbeans zusammen gebastelt und es in Eclipse importiert.

Nun habe ich meine Klasse MainFrame (die das GUI enthällt) und eine Klasse WebReader.

Mein Problem ist folgendes: Ich möchte aus WebReader auf eine JProgressBar (in der Klasse MainFrame) zugreifen und den Wert ändern, aber wie? Ich habs mir mit settern/gettern überlegt, aber dann müsste ich ja in der Klasse WebReader eine neue Instanz von MainFrame (dem GUI) starten, oder nicht?

Dann hab ich mir überlegt, WebReader einfach MainFrame erweitern zu lassen und dann die ProgressBar auf public zu setzen um aus WebReader drauf zuzugreifen, aber das klappt nicht. Ich änder den Wert aber es tut sich nix.

Ka, ich steh grad irgendwie ganz derbe aufm Schlauch. Vielleicht könnt ihr mir irgend nen Denkanstoß geben und das reicht vllt schon.

Grüße
 
Zuletzt bearbeitet:

Sergeant_Pepper

Bekanntes Mitglied
Hi,

ich glaube das Entwurfsmuster "Observer" ist was für dich. Siehe Observer (Entwurfsmuster) ? Wikipedia.

Die Klasse, die die ProgressBar enthält entspräche, vereinfacht gesagt, dem Observer ("Beobachter", der den Status bzw. den Fortschritt in der ProgressBar darstellt). WebReader wäre das "Observable", also das zu beobachtende Objekt.
 

Helgon

Bekanntes Mitglied
Ach richtig, das kann mir sicherlich helfen, danke :)

Hab in der Java Doku noch was anderes gefunden, aber Oberserver Pattern sind glaub ich grad leichter zu integriern, danke! :)
 

Helgon

Bekanntes Mitglied
Ich hab nochmal drüber nachgedacht und mir erscheints doch nicht so ganz richtig.

Das Problem ist ja, dass ich nicht weis wie ich den Wert von der jProgressBar in WebReader ändern kann, nicht dass die jProgressBar es nicht mitbekommen würde.

Grüße
 
M

Marcinek

Gast
Zeig mal deinen code.

Also von einer Klasse ableiten um Zugriff auf Variablen zu bekommen, bedeutet nicht, dass man die gleichen Objekte manipuliert.
 

Helgon

Bekanntes Mitglied
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * MainFrame.java
 *
 * Created on 12.12.2011, 13:58:55
 */
package isbnreader;
import java.awt.Label;
import javax.swing.*;


public class MainFrame extends JFrame {
	
	public JButton jButton1;
    public JLabel jLabel1;
    public JProgressBar jProgressBar1;
    public JTextField jTextField1;
    public Label label1;
    public Label label2;
    public Label label3;
    public Label label4;
    public Label label5;
    public Label label6;
    public Label label7;

    
    public MainFrame() {
        initComponents();
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		WebsiteReader wr = new WebsiteReader(jTextField1.getText().toString());   
		jProgressBar1.setValue(20); // hier z.b. klappt es!
	}
	
	private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
	}
	
	private void jProgressBar1PropertyChange(java.beans.PropertyChangeEvent evt) {
	}
	

	


    public static void main(String args[]) {
    	
    	
    	
	     try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
	     catch (UnsupportedLookAndFeelException e) { }
	     catch (ClassNotFoundException e) {}
	     catch (InstantiationException e) { }
	     catch (IllegalAccessException e) { }
	
	        java.awt.EventQueue.invokeLater(new Runnable() {
	            public void run() {
	                new MainFrame().setVisible(true);
	            }
	        });
	  }
    
    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
    	
    	 jLabel1 = new javax.swing.JLabel();
         jTextField1 = new javax.swing.JTextField();
         jButton1 = new javax.swing.JButton();
         jProgressBar1 = new javax.swing.JProgressBar();
         jProgressBar1.setStringPainted(true);
         label1 = new java.awt.Label();
         label2 = new java.awt.Label();
         label3 = new java.awt.Label();
         label4 = new java.awt.Label();
         label5 = new java.awt.Label();
         label6 = new java.awt.Label();
         label7 = new java.awt.Label();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("ISBNReader - (C) Michael B.");
        setBackground(new java.awt.Color(255, 255, 255));
        setName("frame"); // NOI18N

        jLabel1.setText("ISBN Nr");

        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }
        });

        jButton1.setText("Suchen");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        label1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        label2.setText("Titel");
        label3.setText("Autor");
        label4.setText("Preis");
        label5.setText("label5");
        label6.setText("label6");
        label7.setText("label7");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jProgressBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 599, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 438, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(label2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGap(10, 10, 10))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                                    .addComponent(label4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGap(4, 4, 4)))
                            .addComponent(label3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(4, 4, 4)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(label6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label7, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(5, 5, 5)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(label1, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(label2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(label6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(label7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(11, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

	
    
}

Java:
package isbnreader;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JProgressBar;
 
public class WebsiteReader extends MainFrame {
	
    final String[] KEYWORDS = {"."};
    
    WebsiteReader(String isbn){
    	queryAmazonByUrl("http://www.amazon.de/s/ref=nb_sb_noss?__mk_de_DE=%C5M%C5Z%D5%D1&url=search-alias%3Daps&field-keywords=+"+isbn+"&x=0&y=0");
    	jProgressBar1.setValue(jProgressBar1.getValue()+10); // z.B. Hier - kein error, ide sagt alles richtig aber im endeffekt passiert nix
    }
    
    public void update(){
    }
    
    private void queryAmazonByUrl(String amazonUrl) {
 
        BufferedReader br = null;
        InputStreamReader isr = null;       
        URL url = null;
        
        try {
            url = new URL(amazonUrl);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
 
        if (url != null) {
            try {
                isr = new InputStreamReader(url.openStream());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            br = new BufferedReader(isr);
 
            String line = null;
            File file = new File("source.txt");
            FileOutputStream ausgabe = null;
            
            try {
                ausgabe = new FileOutputStream(file);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            
            DataOutputStream raus = new DataOutputStream(ausgabe);
            
            try {
                while ((line = br.readLine()) != null) {
                    if (checkKeyWords(line)) {
                        try {
                            raus.writeBytes(line+"\n\n");
                        }
                        catch (IOException e) {
                        }
                        System.out.println(line);
                    }
                }
 
            } catch (IOException e2) {
                e2.printStackTrace();
            }
 
        }
 
    }
 
  
    private boolean checkKeyWords(String line) {
 
        for (int i = 0; i < KEYWORDS.length; i++) {
            if (line.indexOf(KEYWORDS[i]) >= 0)
                return true;
        }
 
        return false;
    }
}

Das is es. Hab 2 stellen kommentiert wo ichs z.B. probiert hab

Zeile 36 und 21

Damits jetzt nicht auf die ProgressBar versteift ist.

Auch wenn ich in der Klasse WebsiteReader irgendwo
Java:
abel5.setText("test");
aufrufe klappts auch nicht.

Damit nochmal bisschen klarer ist was mein Problem eigentlich ist, eben dass ich aus Klasse B die werte von Object C in Klasse A ändern kann
 
Zuletzt bearbeitet:

Sergeant_Pepper

Bekanntes Mitglied
Das Problem ist ja, dass ich nicht weis wie ich den Wert von der jProgressBar in WebReader ändern kann, nicht dass die jProgressBar es nicht mitbekommen würde.
Das Observable implementiert eine "Register"-Methode (public), die vom Observer aufgerufen wird. Damit macht sich der Observer beim Observable bekannt. Dadurch erhält das Observable (dein WebReader) eine Referenz auf den Observer, der die ProgressBar enthält.

Der Observer wiederum enthält eine public "update"-Methode. Das Observable kann diese Methode aufrufen, weil es ja eine Referenz auf das Observer-Objekt enthält. Die update-methode kann bspw. die ProgressBar aktualisieren.
Zu Zeitpunkten, die du festlegt, ruft also der WebReader die Methode "update" des Observers (MainFrame) auf.
 

Helgon

Bekanntes Mitglied
So, ich hab mal folgendes gebastelt.

Java:
package isbnreader;

import java.util.Observable;

public class ProgressTeller extends Observable {
	
	public void addProgress(){
		notifyObservers(20);
	}
	
}

Java:
package isbnreader;

import java.util.Observable;
import java.util.Observer;
import javax.swing.JProgressBar;

public class ProgressListener implements Observer {

	private JProgressBar bar;
	
	ProgressListener(JProgressBar bar){
		this.bar = bar;
	}
	
	public void update(Observable arg0, Object arg1) {
		bar.setValue(bar.getValue()+(int)arg1);
	}
	
}

Java:
  public JProgressBar jProgressBar1;

   public Observer progressObserver = new ProgressListener(jProgressBar1);
   ProgressTeller progressTeller = new ProgressTeller();
    
    public MainFrame() {
        initComponents();
        progressTeller.addObserver(progressObserver);
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		WebsiteReader wr = new WebsiteReader(jTextField1.getText().toString());
		progressTeller.addProgress();
		
	}

Nur leider tut sich nix. Ich hab aber auch nicht so die Ahnung ;/ - vllt könntet ihr mir sagen was falsch ist / oder ob der ganze Ansatz für die Katz ist

Grüße
 

Helgon

Bekanntes Mitglied
Da der Edit Button nach ner Zeit wohl verschwindet hier nochmal:

Java:
 public void update(Observable arg0, Object arg1) {
        System.out.println("test"); // <-- dazu und bei aufruf der addProgress() Methode aufm ProgressTeller keine Ausgabe,    irgendwas schein ich wohl noch komplett falsch zu machen
        bar.setValue(bar.getValue()+(int)arg1);
    }
 

Helgon

Bekanntes Mitglied
Hey, ich hab nochmal ein wenig rumprobiert und folgendes gemerkt:

Hier klappts:

Java:
package test;

import java.awt.Label;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class ClassA {
	
	 static JFrame frame = new JFrame();
	 static Label text = new Label("Text 1");
	 static JProgressBar bar = new JProgressBar();
	
	public static void main(String[] args) {
		frame.add(text);
		frame.add(bar);
		frame.pack();
		frame.setVisible(true);		
	}

}

Java:
package test;

public class ClassB extends ClassA {

	ClassB(){
		text.setText("test3");
		bar.setValue(20);
	}

}

Hab die Objekte dann auch in meinem Programm static gemacht und es genau so probiert, nur tut sich leider nix. Hat wer ne Idee worans liegt?


EDIT:-----------

Mir fällt grad noch was auf.

Java:
 public  void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		WebsiteReader wr = new WebsiteReader(jTextField1.getText().toString());
    	        jProgressBar1.setValue(100);
	}

Wenn ich es im eventHandler aufrufe wie hier, verändert sich die ProgressBar auch nicht. Wenn ich das aber sonst wo in MainFrame aufrufe klappts.
Ich dreh echt am Rad weil ich ka hab warum es so ist / es nicht klappt.

Grüße
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Java:
  public JProgressBar jProgressBar1;

   public Observer progressObserver = new ProgressListener(jProgressBar1);
Schwer da was zu sagen, ohne den Code zu kennen, aber wenn das oben so in der Reihenfolge in Deinem Code steht, ist jProgressBar1 noch gar nicht initialisiert wenn es dem ProgressListener übergeben wird. Allerdings sollte dann beim Ausführen irgendwo einen NullPointerException kommen...
 
B

bygones

Gast
Code der die UI aendert muss im EDT aufgerufen werden bzw Code der groessere Rechenoperationen ausserhalb der UI startet sollte da seinen eigenen Thread bekommen - hast du das gemacht ?
 

Helgon

Bekanntes Mitglied
Schwer da was zu sagen, ohne den Code zu kennen, aber wenn das oben so in der Reihenfolge in Deinem Code steht, ist jProgressBar1 noch gar nicht initialisiert wenn es dem ProgressListener übergeben wird. Allerdings sollte dann beim Ausführen irgendwo einen NullPointerException kommen...

1-2 Posts drüber steht doch der gesamte Code

und in den Posts weiter drunter schreib ich ja das es in den Fällen geht.
Da wunderts mich eben warum es im großen nicht geht.
 

Michael...

Top Contributor
OK, dann sind das die Zeilen die oben dazu gekommen sind?
Damit bleibt aber immernoch das Problem bestehen, dass die Variable
Code:
jProgressBar1
bei der Übergaben an den Listener nicht initialisiert wird und somit
Code:
null
übergeben wird.
 

Michael...

Top Contributor
Hab's mir noch mal genauer etwas angeschaut.
Die Vererbungslogik würde ich nochmal über denken. Warum muss WebsiteReader von MainFrame erben? Saubere OOP ist das nicht.
Komischer wird es dann noch, dass vermutlich in MainFrame ein WebsiteReader Objekt erstellt wird. Somit exitieren schon mal mindestens zwei Variablen mit Name
Code:
jProgressBar1
, bist Du Dir sicher, dass dann überall auf die richtige ProgressBar zu geriffen wird? Grundsätzlich würde ich Instanzvariablen als private deklarieren, damit wäre zumindest mal verhindert, dass man Ausversehen von aussen auf eine Veriable zugreift auf die man nicht zugreifen wollte/sollte.
 

Helgon

Bekanntes Mitglied
Wenn du dir das hier anschaust merkste vllt was komisch ist. Es müsste gehen (auch wenns nicht ganz sauber gelöst ist) aber in meinem Fall mit MainFrame und WebsiteReader klappts nicht

Hey, ich hab nochmal ein wenig rumprobiert und folgendes gemerkt:

Hier klappts:

Java:
package test;

import java.awt.Label;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class ClassA {
	
	 static JFrame frame = new JFrame();
	 static Label text = new Label("Text 1");
	 static JProgressBar bar = new JProgressBar();
	
	public static void main(String[] args) {
		frame.add(text);
		frame.add(bar);
		frame.pack();
		frame.setVisible(true);		
	}

}

Java:
package test;

public class ClassB extends ClassA {

	ClassB(){
		text.setText("test3");
		bar.setValue(20);
	}

}

Hab die Objekte dann auch in meinem Programm static gemacht und es genau so probiert, nur tut sich leider nix. Hat wer ne Idee worans liegt?


EDIT:-----------

Mir fällt grad noch was auf.

Java:
 public  void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		WebsiteReader wr = new WebsiteReader(jTextField1.getText().toString());
    	        jProgressBar1.setValue(100);
	}

Wenn ich es im eventHandler aufrufe wie hier, verändert sich die ProgressBar auch nicht. Wenn ich das aber sonst wo in MainFrame aufrufe klappts.
Ich dreh echt am Rad weil ich ka hab warum es so ist / es nicht klappt.

Grüße

Hab's mir noch mal genauer etwas angeschaut.
Die Vererbungslogik würde ich nochmal über denken. Warum muss WebsiteReader von MainFrame erben? Saubere OOP ist das nicht.
Komischer wird es dann noch, dass vermutlich in MainFrame ein WebsiteReader Objekt erstellt wird. Somit exitieren schon mal mindestens zwei Variablen mit Name
Code:
jProgressBar1
, bist Du Dir sicher, dass dann überall auf die richtige ProgressBar zu geriffen wird? Grundsätzlich würde ich Instanzvariablen als private deklarieren, damit wäre zumindest mal verhindert, dass man Ausversehen von aussen auf eine Veriable zugreift auf die man nicht zugreifen wollte/sollte.


Hey, ich verstehe nicht ganz warum es zwei Variablen mit Name
Code:
jProgressBar1
geben soll? Nur weil ich ein Objekt von WebsiteReader erzeuge?

(ich denke ich weis was du meinst, die zweite Zeile im Konstruktor? Gedanke war das ich auf das geerbte JProgressBar Objekt namens jProgressBar1 zugreife und eigentlich funktioniert das ja auch wenn du auf meine quote schaust. Das Beispiel mit ClassA und ClassB

Grüße
 

Michael...

Top Contributor
Gedanke war das ich auf das geerbte JProgressBar Objekt namens jProgressBar1 zugreife und eigentlich funktioniert das ja auch wenn du auf meine quote schaust. Das Beispiel mit ClassA und ClassB
In wiefern funktioniert das ClassA/ClassB Beispiel? ClassB hat ja keine main zum Ausführen. klar kann man das jetzt noch ergänzen, damit ein Fenster mit 20% gefülltem Ladebalken sichtbar ist.
Allerdings hat der Code grundsätzlich gar nichts mit Programmieren zu tun.
Vergiss den Versuch mit static ganz schnell wieder.
Hey, ich verstehe nicht ganz warum es zwei Variablen mit Name jProgressBar1 geben soll? Nur weil ich ein Objekt von WebsiteReader erzeuge?
Wo wird denn
Code:
new WebsiteReader(jTextField1.getText().toString())
ausgeführt ich vermute mal in einem MainFrame Objekt? letzteres besitzt ja bereits eine Instanzvariable (Objektspezifische Variable)
Code:
jProgressBar1
. Da WebsiteReader von MainFrame erbt besitzt das neu erzeugte Objekt ebenfalls eine eigene Variable
Code:
jProgressBar1
.
Hier mal Dein Konstrukt verkürzt dargestellt:
Java:
public class ClassA {
	
	public String variable = "Variable der Klasse ClassA";
	
	public static void main(String[] args) {
		ClassA a= new ClassA();
		ClassB b = new ClassB();
		System.out.println(a.variable);
		System.out.println(b.variable);
	}
}

class ClassB extends ClassA {
	public ClassB() {
		variable = "Variable der Klasse ClassB";
	}
}

Folgendes kann ich Dir nur nahe legen:
- möglichst wenig statische Variablen verwenden (in den meisten Fällen - so wie in Deinem - braucht man gar keine)
- Instanzvariablen möglichst als
Code:
private
, maximal als
Code:
protected
deklarieren.
- sich mal die Grundlagen der Objekt Orientierung anschauen und bewusst machen was Objekte sind.
 

Helgon

Bekanntes Mitglied
Hey, ja stimmt. Alles einleuchtend.

Ich hab noch ein wenig Probleme mit der OOP Umsetzung.
Ansich ist mir natürlich klar was OOP ist, aber wenns dann an die Umsetzung von für mich relativ OOP Abstrakte Sachen geht blick ich nicht mehr ganz durch.

Dann noch mal eine Frage.
Ich hab MainFrame momentan als Start Klasse, also die die aufgerufen wird wenns kompiliert wird.

Sollte ich lieber eine dritte Klasse haben z.B. Main die ein MainFrame erzeugt?

Grüße
 

Michael...

Top Contributor
Grundsätzlich gilt eigentlich die Regel nur von einer Klasse zu erben, wenn man diese in Ihrer orginären Funktion erweitert. Daher sollte eigentlich auch MainFrame nicht von JFrame erben (würde von JPanel erben). Ansonsten versucht man in komplexeren Projekten eine Applikation in Ihre Bestandteile aufzuteilen und diese in möglichst unabhängig von einander zu implementieren. Die vermutlich bekanntesten Entwurfsmuster sind hier zu das Observer Pattern und das MVC Pattern
 

Helgon

Bekanntes Mitglied
Hey, den Tipp mit den Observern hatte ich ja bereits bekommen, aber ich hatte da irgendwie noch was falsches im Kopf.

Der Wiki Link hat mich tatsächlich nochmal bisschen aufgeklärt, aber ich hab folgendes Problem, oder besser gesagt. Ich hab Ka wie ich das von der Logik her umsetzten muss/kann. Vllt kannste mir den Ansatz sagen.

Ich hab meinen Observer und momentan nur eine Listener

Java:
// Class MainFrame
         ProgressTeller teller = new ProgressTeller();
	 ProgressListener bar  = new ProgressListener("ProgressBar");
     
    public MainFrame() {
    	initComponents();
    	teller.addObserver(bar);
    }
    
    public  void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {	
		teller.addProgress(jProgressBar1);
	}

Funktioniert auch alles (ich werd benachrichtigt über ne Konsolenausgabe), aber ich hab ka wie ich dannach in meiner Main Methode damit was anfangen kann.
Wie kann ich in der Main Methode "abfangen" das der Observer benachrichtigt wurde?

Java:
public class Main {

    public static void main(String[] args) {
    	MainFrame frame = new MainFrame();
    	frame.setVisible(true);

    }






Java:
package isbnreader;

public class ProgressTeller extends Observable {
	
	public void addProgress(JProgressBar bar){
		setChanged();
		notifyObservers(bar);
	}
	
}

public class ProgressListener implements Observer {

	final private String name;
	
	ProgressListener(String name){
		this.name = name;
	}
	
	@Override
	public void update(Observable arg0, Object arg1) {
		System.out.println(arg0.toString());
		System.out.println(arg1.toString());		
	}
	
}

P.S.: Nicht wundern das ich im ProgressTeller eine JProgressBar als Argument erwarte. Ich dachte nur, dass ich dann in der update() Methode über das
Code:
Object arg1
vllt direkt auf die Methoden der JProgressBar (.setValue()) hätte zugreifen können, klappt aber nicht :p
 
Zuletzt bearbeitet:

Helgon

Bekanntes Mitglied
AHHHHHHHHHHHHHHHHHHHHHHHHH! Endlich geschafft, befreiend dieses Gefühl :D Ich trottel war einfach zu doof um drauf zu kommen mal zu casten -.-" :D Naja bei so Fehlern, die vergisst man dafür nicht mehr so schnell haha :D

Ich post mal die Lösung, wer weis wann jemand mal das selbe Problem hat.

Java:
package isbnreader;

import java.util.Observable;

import javax.swing.JProgressBar;

public class ProgressTeller extends Observable {
	
	public void addProgress(JProgressBar bar){
		setChanged();
		notifyObservers(bar);
	}
	
}

Java:
package isbnreader;

import java.util.Observable;
import java.util.Observer;
import javax.swing.JProgressBar;

public class ProgressListener implements Observer {

	final private String name;
	private JProgressBar bar;
	
	ProgressListener(String name, JProgressBar bar){
		this.name = name;
		this.bar = bar;
	}
	
	@Override
	public void update(Observable arg0, Object arg1) {
		System.out.println(arg0.toString());
		System.out.println(arg1.toString());
		System.out.println(((JProgressBar) arg1).getValue());
		((JProgressBar) arg1).setValue(50);

		//bar.getValue();
	}
	
	
	
}

Java:
public class MainFrame extends JFrame {

     private JProgressBar jProgressBar1;
  
     
     ProgressTeller teller = new ProgressTeller();
	 ProgressListener bar  = new ProgressListener("Test Bar", jProgressBar1);
     
    public MainFrame() {
    	initComponents();
    	teller.addObserver(bar);
    }
    
    public  void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {	
		teller.addProgress(jProgressBar1);
	} 

//[...]

Danke für die Tipps mit dem Observer :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Methoden aufrufen - auch klassenübergreifend? Java Basics - Anfänger-Themen 9
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
S Vererbung Variablen klassenübergreifend nutzen Java Basics - Anfänger-Themen 42
F Klassenübergreifend String verändern Java Basics - Anfänger-Themen 5
E JButton klassenübergreifend nutzen? Java Basics - Anfänger-Themen 6
R array klassenübergreifend Java Basics - Anfänger-Themen 3
R Variablen Klassenübergreifend nutzen Java Basics - Anfänger-Themen 18
D Wie kann Variablen,Methoden Klassenübergreifend zugreifen? Java Basics - Anfänger-Themen 4
richis-fragen Anzeigeposition vom ToolTip ändern Java Basics - Anfänger-Themen 6
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
J Farbe des Striches eines TitledBorders ändern Java Basics - Anfänger-Themen 2
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
B Variablen Int Variabel in JTextField ändern Java Basics - Anfänger-Themen 2
W Methode ändern Java Basics - Anfänger-Themen 65
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
B Filepath "ändern"? Java Basics - Anfänger-Themen 5
t2im Java Array-Länge ändern? Java Basics - Anfänger-Themen 22
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
amelie123456 Geschwindigkeit der Methode bewegeDich eines Objekts ändern Java Basics - Anfänger-Themen 2
P Standard resources-Verzeichnis ändern Java Basics - Anfänger-Themen 9
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Vamecruft Compiler-Fehler public static void zu static String ändern Java Basics - Anfänger-Themen 2
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
J Itext-Paragraph Position ändern Java Basics - Anfänger-Themen 13
Z Attribut ändern ohne Kontrollstruktur Java Basics - Anfänger-Themen 2
R Boolean value ohne Kontrollstrukturen ändern Java Basics - Anfänger-Themen 5
V Umgebungsvariable Genutzte Javaversion in der Konsole ändern Java Basics - Anfänger-Themen 5
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
R Was muss ich an meinem Code ändern? Java Basics - Anfänger-Themen 2
M Werte ändern sich nicht mehr nach Reset Java Basics - Anfänger-Themen 14
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
W Eclipse Autoformatierung für Streams ändern ? Java Basics - Anfänger-Themen 1
M Programm per Nutzereingabe ändern Java Basics - Anfänger-Themen 3
D Wert des Arrays unter Bedingungen ändern Java Basics - Anfänger-Themen 1
L Java Date Format ändern Java Basics - Anfänger-Themen 5
M Mit KeyListener Farbe von Label ändern Java Basics - Anfänger-Themen 13
F Schriftgröße ändern Java Basics - Anfänger-Themen 2
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
J Kapselung Array in Set ändern und in Main ausgeben lassen Java Basics - Anfänger-Themen 4
D scheduledAtFixedRate speed ändern Java Basics - Anfänger-Themen 2
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
krgewb Icon von JButton ändern Java Basics - Anfänger-Themen 1
Anica Processing Animation Bild-Position ändern Java Basics - Anfänger-Themen 9
Henri Erste Schritte Iteration ändern Java Basics - Anfänger-Themen 12
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
CptK Interface Cursor ändern Java Basics - Anfänger-Themen 8
B Eclipse Tabellen Farbe ändern? Java Basics - Anfänger-Themen 2
I Ordnung JLayeredPane mit Button ändern Java Basics - Anfänger-Themen 5
S Array Eintrag ändern Java Basics - Anfänger-Themen 6
J variablePathPart ändern nach dem Ordner abgearbeitet worden ist Java Basics - Anfänger-Themen 1
P Methode soll Variable einer anderen Klasse ändern. Wie? Java Basics - Anfänger-Themen 1
M im String Alphabet ändern Java Basics - Anfänger-Themen 3
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
Jinnai4 Werte in Textdatei ändern Java Basics - Anfänger-Themen 2
S Bestehendes Java Programm, einen festen Wert ändern Java Basics - Anfänger-Themen 17
W JLabel, Farbe durch Listener ändern Java Basics - Anfänger-Themen 6
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
T Parameter das übergeben wurde ändern? Java Basics - Anfänger-Themen 1
M Methoden Generische Klasse - ändern einzelner Attributwerte Java Basics - Anfänger-Themen 2
Hijo2006 Eclipse: Java Icon ändern Java Basics - Anfänger-Themen 9
S Schriftart/Farbe im Grafikfenster ändern Java Basics - Anfänger-Themen 8
G BenutzerDaten teilweise ändern in txt Datei Java Basics - Anfänger-Themen 10
J Button in anderer Klasse ändern Java Basics - Anfänger-Themen 3
E Hash map Value Wert hochzuholen/ändern Java Basics - Anfänger-Themen 7
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
Voreck Jar Dateien Standart programm ändern Java Basics - Anfänger-Themen 12
R Vererbung Variable in einem übergeordneten Objekt ändern Java Basics - Anfänger-Themen 4
R JTextArea final Status ändern Java Basics - Anfänger-Themen 11
W Methoden Methode auf Array aufrufen, und dieses Array dabei ändern? Java Basics - Anfänger-Themen 10
A Variablen Variable soll ihren Wert nach Initialisierung nicht mehr ändern Java Basics - Anfänger-Themen 2
B Alle Attribute von Klasse bekommen und ändern Java Basics - Anfänger-Themen 12
J Klassen Klassenmethode um Variable zu ändern Java Basics - Anfänger-Themen 7
L zweidimensionales char array reihenfolge ändern ? Java Basics - Anfänger-Themen 2
D Eigenschaften eines Objektes ändern Java Basics - Anfänger-Themen 1
D Opencsv-3.5 DEFAULT_DATE_FORMAT ändern Java Basics - Anfänger-Themen 8
M Erste Schritte Code zur Laufzeit ändern lassen Java Basics - Anfänger-Themen 3
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
I erstelle Vorschaubild mit der lib PDF-Renderer und möchte danach Dateiname ändern -> geht aber nicht Java Basics - Anfänger-Themen 0
G Bei Mouseover Grafik ändern, gutes Vorgehen gesucht Java Basics - Anfänger-Themen 0
U Tabelle ändern und die Inhalte speichern Java Basics - Anfänger-Themen 9
J Input/Output Zeile in Textdatei ändern Java Basics - Anfänger-Themen 14
Z JLabel Icon ändern Java Basics - Anfänger-Themen 2
H Liste ausgeben (Spiel Hey Fisch (software-challenge) ändern Anzahl Fische) Java Basics - Anfänger-Themen 1
N Variablen ändern wenn eine andere geändert wird Java Basics - Anfänger-Themen 7
U Farbe meines Würfels jede sekunde ändern! Java Basics - Anfänger-Themen 5
I JTree, Root-Name ändern Java Basics - Anfänger-Themen 4
Z System(einstellungen) per Java ändern/Steuern | Betriebssystembezogen Java Basics - Anfänger-Themen 7
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Systemzeit ändern Java Basics - Anfänger-Themen 7
W Konsolenprograamm in GUI-Programm ändern Java Basics - Anfänger-Themen 1
D JLabel ändern in actionperformed Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben