Mit setter-Methode JLabel in einer andern Klasse ändern.

Herr.Blacky

Mitglied
Möchte ein Fenster haben, was die Punkte zählt, bzw. Punkte abzieht wenn die Zahl nicht erraten worden ist.
Der Code des JFrames. Mit den Button "Test" funktioniert alles wunderbar. Klapppt gut. Nur wenn ich die setPunkte (); in einer anderen Klasse verwenden geht es nicht.

Zum Beispiel, wenn ich aus anderen Klasse die Punktezahl ändern möchte. Die Berechnung mit punkte(); geht wunderbar.

Vielleicht jemand ein Tipp? Kann es damit zusammenhängen, dass durch das Aufrufen in andern Klasse, dies nicht das selbe Objekt ist?

Danke :)

Java:
public class FensterBib2 {

    
    
    private JLabel zahl = new JLabel(""+10+"");
    
    int punkte = 10;
    
    public void pointCounter () {
        JFrame pointCounter = new JFrame ("Deine Punktzahl!");
        JButton Test = new JButton ("Test");  // nur zum testen der methode
        JLabel showpoint = new JLabel("Deine Punkte: " );
        
        Font schrift = new Font("Arial",66,66);
        zahl.setFont(schrift);
        JPanel panel1 = new JPanel ();
        JPanel panel2 = new JPanel    ();
        JPanel panel3 = new JPanel    ();
        
        pointCounter.add(panel1);
        pointCounter.add(panel2);
        pointCounter.add(panel3);
        
        
        pointCounter.setLayout(new GridLayout(4,0,5,5));
        panel1.add(showpoint);
        panel2.add(zahl);
        panel3.add(Test);
        pointCounter.setLocationRelativeTo(null);
        
        
        
        Test.addActionListener(new Actionlistener()
                
                {
                    
                 public void actionPerformed (ActionEvent e)
                 {
                      punkte(1);
                      setPunkte();
                      
                      if (getPunkte()<5)
                          
                      {
                          zahl.setForeground(Color.RED);
                          
                      }
                      
                 }});
            
        pointCounter.setSize(100,100);
        pointCounter.setVisible(true);
        pointCounter.setDefaultCloseOperation(2);
        
        pointCounter.pack();
        
    }


          public void punkte (int abzug)
    
          {
        
        punkte = punkte - abzug;
        
        System.out.println("Das sind die Punkte: " + punkte);
        System.out.println("Der getter = " + getPunkte());
        
          }

           public int getPunkte ()
           {
               
               return (punkte);
               
           }
           
           public void setPunkte()
           
           {
            zahl.setText(""+getPunkte());  //Todo funktioniert nicht in anderen klassen..
               
             
           }
           
}
 
M

Mart

Gast
setze mal ein system.out.println davor ... wenn du es von der anderen klasse aufrufst

wenn nix kommt -> du hast es irgendwo versaubeutelt ;)
wenn was kommt -> kann sein dass das window nicht geupdated ist oder ähnliches oder du nicht auf dem fenster im moment bist o ä

einfach mal einschränken was passiert... und ob was passiert so kann man leichter fehler ( selber ) finden... man muss es nicht unbedingt mit dem debug breakpoint machen
 

Herr.Blacky

Mitglied
Dachte ich mir. In der Main-Methode rufe ich direkt das Punktefenster auf, dies solll auch immer angezeigt werden.
Die Methode .punkte(1); und getPunkte(); funktioniert wundbar von der Mainmethode aus.
Einzige Problem ist, ich kann den Punktstand von der Mainmethode nicht ändern mit setPunkte();, sprich das Fenster nicht aktualisieren.


Habe mal ein Bild eingefügt, zur Vorstellung.






Unbenannt.PNG
 

Herr.Blacky

Mitglied
Hoffentlich kann man damit etwas anfangen :D, bin totaler Anfänger :), der andere Code steht oben. Danke!

Main-Methode:


Java:
public class Launch {
    
    
    
    
    
    
    public static void main(String[] args) {
        
        
    
        //....
        
         //PointCounter
          FensterBib2 Pointcounter = new FensterBib2();
          Pointcounter.pointCounter();
          Pointcounter.punkte(1);   
          Pointcounter.setPunkte();
          
        {   
            
        //Start Frame   
        FensterBiB Fenster1 = new FensterBiB();
        Fenster1.Frame0();   
        }

Frame0 ActionListener:

Java:
{
                    public void actionPerformed(ActionEvent e)       
            
                    {
                        FensterBib2 punkte = new FensterBib2 ();
                        punkte.punkte(1);
                        punkte.setPunkte();
                        
                        
                        eingabeMax.getText();  //Eingabefeld der Zahlen
                        eingabeMin.getText();  //Eingabefeld der Zahlen
                        
                        int max = Integer.parseInt(eingabeMax.getText());
                        int min = Integer.parseInt(eingabeMin.getText());
                        
                        Rechnenoperation setZahlen = new Rechnenoperation();
                        setZahlen.setMax(max);
                        setZahlen.setMin(min);
                        setZahlen.Zufall();
                        Frame();
                        Fenster.dispose();
                        
                        

                        
                        
                    }
 

mihe7

Top Contributor
Du erzeugst im unteren Code in Zeile 5 ein neues FensterBib2. Stattdessen solltest Du das in main erstellte FensterBib2 verwenden.
 

Herr.Blacky

Mitglied
Ja, okay. Dache ich mir. Nur, wie greife ich auf diese Fenster zu?
Einfach eine Methode in Main schreiben, die setPunkte() ausführt ? Die ich dann im ActionListerner aufrufe?
 

Herr.Blacky

Mitglied
Ok, vielen Dank. Habe das Attribute mit dem JLabel statisch gemacht. Damit es immer das selbe "Objekt" ist. Denke nicht die beste Lösung, aber funktioniert. :)
 

mihe7

Top Contributor
Mal ein kleines Beispiel:

Punktefenster:
Java:
public class PointsView extends JFrame {
    private int points;
    private JLabel pointsLabel;

    public PointsView() {
        pointsLabel = new JLabel("0");
        add(pointsLabel);
    }

    public void increasePoints() {
        points++;
        pointsLabel.setText(Integer.toString(points));
    }
}

Jetzt ein Fenster, das einen Button enthält, mit dem die Punkte in einem PointsView-Objekt hochgezählt werden können:
Java:
public class MainWindow extends JFrame {
    public MainWindow(final PointsView points) {
        JButton button = new JButton("Mehr");
        button.addActionListener(e -> points.increasePoints());
        add(button);
    }
}

Und noch eine Klasse, die alles zusammenbringt:
Java:
public class App {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            PointsView pointsView = new PointsView();
            MainWindow window = new MainWindow(pointsView);
            show(pointsView);
            show(window);
        });   
    }

    private static void show(JFrame frame) {
        frame.setSize(200,200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

Das ist bei weitem nicht die beste Lösung. Ein erster Schritt wäre die Einführung eines Interfaces, um die Klassen zu entkoppeln. Der nächste Schritt wäre die Daten auszulagern und per Ereignis die View über Änderungen zu informieren (s. Observer Pattern).
 
M

Mart

Gast
Das ist bei weitem nicht die beste Lösung. Ein erster Schritt wäre die Einführung eines Interfaces, um die Klassen zu entkoppeln
also da wäre ich auch interesisert, zumindest mal den ansatz zu sehen wie man das im kleinen stil machen kann ? im kleinen stil funtkioniert ja meistens auch im großen stil :D
 

mihe7

Top Contributor
Das ist einfach (wobei ich es mir hier spare, ordentliche Bezeichner zu finden):
Java:
public interface Incrementable {
    void increasePoints();
}

Die Klasse PointsView implementiert jetzt einfach das Interface
Java:
public class PointsView extends JFrame implements Incrementable {

und die Klasse MainWindow verlangt nun keine PointsView mehr sondern nur noch ein Incrementable:
Java:
    public MainWindow(final Incrementable incrementable) {
        JButton button = new JButton("Mehr");
        button.addActionListener(e -> incrementable.increasePoints());
        add(button);
    }
Damit kennen sich die Klassen MainWindow und PointsView nicht mehr.
 

Herr.Blacky

Mitglied
Danke :)

Glaube mein Problem ist, dass ich es in der Theorie weiß, dass wenn ich eine neue Instanz einer Klasse aufrufe, verschiedene Speicher-Referenzen gibt.

Leider kann ich damit noch nicht gut genung mit im Code umgehen. Sprich genau die richitge Referenz/Objekt anzusteuern. Deswegen habe ich die Attribute statisch programmiert, um sie vom Objekt zu entkoppeln.

dann muss ich in meinem Programm zwischen 3 Klassen agieren.. :)

Danke für die Hilfe, werde mir die Lösungen genau angucken, als Anfänger brauche ich immer etwas.
 
M

Mart

Gast
das umgehen lernt man ganz easy ohne fehler so : du machst fehler ( ohne absicht ) und verbesserts sie selber ;)
 

mihe7

Top Contributor
Deswegen habe ich die Attribute statisch programmiert, um sie vom Objekt zu entkoppeln.
Statisch = nicht objektorientiert. Gerade als Anfänger solltest Du das Schlüsselwort static nur in zwei Fällen verwenden:
  1. die main-Methode (die muss zwingend static sein)
  2. Konstanten (static final)
Etwas später kannst Du Dir noch Gedanken machen, wann es sinnvoll sein kann, eine statische Methode zu verwenden. Insofern ist meine App-Implementierung kein gutes Beispiel. Besser:

Java:
public class App {
    private final int frameWidth;
    private final int frameHeight;

    public App(int frameWidth, int frameHeight) {
        this.frameWidth = frameWidth;
        this.frameHeight = frameHeight;
    }

    private void run() {
        PointsView pointsView = new PointsView();
        MainWindow window = new MainWindow(pointsView);
        show(pointsView);
        show(window);
    }

    private void show(JFrame frame) {
        frame.setSize(frameWidth, frameHeight);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            App app = new App(200, 200);
            app.run();
        }
    }
}
 

Herr.Blacky

Mitglied
Möchte auch keine statische Methoden und Attriubte verwenden.
Mein Problem ist gerade noch, dass ich mehere Klassen-Objekte von einer Klasse in anderen Klassen aufrufe, dadurch mehere Speicher-Referenzen erzeuge, und ich so nicht vom ersten berechneten Attribute (Klassen-Attribute) den Wert bekomme, außer ich verwende das erste Objekt.

Wenn ich meine Methode nur in einer Klasse laufen lasse, ohne statische Attribute funktioniert alles.

In der Klasse "Operationen" habe ich eine Methode, die einen festen Integer immer um 1 verringert.
Diese Methode rufe ich in einer anderen Klasse auf, und sie fängt natürich wieder von vorne an.

Ah okay, danke für das Beispiel :)
 
M

Mart

Gast
In der Klasse "Operationen" habe ich eine Methode, die einen festen Integer immer um 1 verringert.
Diese Methode rufe ich in einer anderen Klasse auf, und sie fängt natürich wieder von vorne an.
ein "int" hat keine referenz sondern nur einen wert

wie kannst du irgendwo was ändern und wo anders dann das mitkriegen? in dem du mit einer referenz auf das gleiche objekt zeigst... "int" hat keine Referenz, somit funuz es nicht .. Wrapper klassen wären da vllt zu erwähnen ( objekte von den primitiven datentypen MIT referenzen )
 

Herr.Blacky

Mitglied
Ok, falscher Terminus gewählt. Habe mal schnell ein Beispiel gemacht. Nur, wie kann ich von einer anderen Klasse, auf die Variabel Fenster1 zugreifen, zum Beispiel, um das Label des Fenster von Fenster1 noch zu ändern, mit setText();.


Mit : Framebib Fenster1 = new Framebib. Erstelle ich doch eine Instanz oder ?


Java:
public class Launch {

    public static void main(String[] args) {
        
        
    
        
        
        
        Framebib Fenster1 = new Framebib ();
        Fenster1.setText1("Hallo 1");
        Fenster1.fenster1();
        
        Fenster1.setVisible(true);
        Fenster1.setSize(400,400);
        
        
        
        
        
        
        Framebib Fenster2 = new Framebib();
        Fenster2.fenster1();
        Fenster2.setVisible(true);
        Fenster2.setSize(200,200);
        Fenster2.setText1("Hallo 2");
        System.out.println(Fenster1.getText1());
        System.out.println(Fenster2.getText1());
        
    }
    
}





Java:
public class Framebib extends JFrame {
    
     private JLabel points;
     private String text1;
    
    
    
    
    
    public void fenster1 ()
    {
        
        setLayout(new BorderLayout());
        points = new JLabel (getText1());
        add(points, BorderLayout.CENTER);
        points.setVisible(true);
        points.setSize(40,40);
        setLayout(new BorderLayout());
        
        
    }
    
    
    
    
    public void setText1 (String Text1)
    {
        
        this.text1=Text1;
        
    }
    
    public String getText1 ()
    
    {
        
        
        return(text1);
        
        
        
    }

Ausgabe:
Hallo 1
Hallo 2
 
M

Mart

Gast
Java:
public class Framebib extends JFrame {
    
     private JLabel points;

    
    public void setText1 (String Text1)
    {
        
        points.setText(text1);
        
    }
?
 

Herr.Blacky

Mitglied
ja, natürlich. Habe meinem Code jetzt verbessert. Nurnoch einen Integer auf static. Glaube mein Problem kam nicht vollständig rüber...sry.

Die set-Methode habe ich genau so benutzt. Aber nicht geklappt.

Dankeschön :)
 
M

Mart

Gast
ich weis nicht wie die setText methode vom label heist in swing dsa war geraten aber diese methode muss es geben

jLabel2.setText("Type in the internet address of a document or web page.");



Also um jetzt allgemein mal was zu static zu sagen:
-static KANN man für factories hernehmen
-static kann man bei Zustands unverändernden Methoden zb du brauchst für den Kompletten durchlauf NUR die Pramaeter und lokale Variablen ( zb static int sum ( par1 , par2 ){ return par1 + par2 }
-static kann man für konstanten benutzen (dh static final ..sind aber streng nur immutables konstanten )
usw

du versuchst einen zustand anzugeben ... was nicht gut ist nur weil du es nicht schaffst eine referenz zu übergeben wo beide auf den gleichne speicher schauen..nicht böse gemeint
 
Zuletzt bearbeitet von einem Moderator:

Herr.Blacky

Mitglied
Bin für jeden Tipp offen.
Ich habe das verstannden, wie man mit einen Getter und Setter arbeitet. Jetzt habe ich nur einen Integer auf static. Dieser Integer ist meine Zufallszahl. Jede Methode greift auf diese Zahl zu, die natürlich immer die selbe sein sollte.
 
M

Mart

Gast
ABER diese sätze die du gearade gesagt hattest treffen auf eine Klasse zu ... stell dir vor du willst im sichtbaren bereich 1mal das mit den zahlen durhclaufen lassen und im hintergrund mit anderen ... dann funtkionierts nimmer weils nur 1e Zufalls zahl gibt

ich versteh im moment nicht das "wirkliche" problem ... angenommen du hast 5 klassen und alle diese Klassen brauchen eine Selbe Random Zahl?

darf sich die Zahl ändern?

Wenn sie sich irgendwo ändert müssen sich die Anderen anpassen?


die fragen wären mir mal wichtig ...
@Herr.Blacky
 

Herr.Blacky

Mitglied
Okay :) Ist ja mein erstes "Projekt". Der Spieler generiert eine Zufallszahl, dessen Intervall er bestimmt .
Diese Zahl ist dem Spieler nicht bekannt und er kann sie erraten durch Hints.

Ich habe alles, was mit der Rechnung zu tun hat, Rechenoperationen in einer Klasse gepackt :


Java:
import java.util.Random;


public class Rechenoperation  {
   
   
   
    private static int Zufallszahl;
    private int Teiler = 4;
    private int Summand = 3;
    private int Faktor = 3;
    private int max;
    private int mind;
    private int Summe;
    private float Quotient;
    private int Modulo;
    private String ArtD;
    private int Produkt;
    private int [] Matrix= new int [3];
    private String primSolution;
   
 
 
   
    public void matrix ()
   
    {
       
    int a = getZufallszahl();  
    int b = a -9;
    int c = -b -a+ 10;      
   
   
   
    //Matrix = new int [3];
    Matrix [0] = b;
    Matrix [1] = a;      
    Matrix [2] = c;
   
    System.out.println("Das ist b = " + c);
    System.out.println("Das ist b = " + b);
    System.out.println(a+b+c);
       
       
   
   
   
    for ( int i =0; i < Matrix.length; i++)
   
    {
       
        System.out.println("Die Elemente der Matrix "+ Matrix[i]);
       
    }
    }
   
   
 
   
    public void Zufall () {
         Random random = new Random();
      {
     
         
         
      Zufallszahl = random.nextInt(max + mind) + mind;
               
      System.out.println(getZufallszahl()+ " Kontrolle Zufallszahl =");    
    }
   
    {
       
        System.out.println("Rechnenoperation wurde ausgeführt!");
    }
   
   
   
               
     
           
       
         
    }
     
      public  void addieren () {
     
         
      Summe = Zufallszahl + Summand;
     
      System.out.println(Summe + " mit 3 addiert");
     
     
     
      }
         
      public  void dividieren () {
         
          Quotient = Zufallszahl / Teiler;
         
         
      }  
         
         
         
         
     
     
     
      public void modulo () {
         
          Modulu = Zufallszahl % Teiler;
         
         
         
         
      }
     
     
     
     
     
      public void artDivision () {
         
         
          String ausgabemodu = "X";
          ArtD= ausgabemodu;
         
          if (Modulu==0) {
             
               ausgabemodu = "Die Zufallszahl dividiert mit 4 hat keinen Rest";
          }
         
          else {  
                     
                   ausgabemodu = "Die Zufallszahl dividiert mit 4 hat einen Rest!";
            }
         
         
          System.out.println(ArtD);
         
         
         
         
          }
             
             
         
     
     
     
      public multiplizieren (){
         
          Produkt = Zufallszahl * Faktor;
         
        
      }

Diese Methoden funktionieren wunderbar.



Nach dem ersten Frame, wo der Spieler seine Zahl generiert hat, rufe ich ja in einer andere Klasse die Methode addieren() auf, und muss eine neues Objekt mit : Rechenoperation addieren = new Rechenoperation (); erstellen, doch in dieser Instanz/Objekt ist ja nicht die Zufallszahl gespeichert, das sagt auch mein Test, wenn ich dann die nicht statische Zufallszahl ausgebe, kommt 0 herraus.


Zitat :
angenommen du hast 5 klassen und alle diese Klassen brauchen eine Selbe Random Zahl?
Jap :)
 
M

Mart

Gast
ok also du läufst gerade in ein Problem ... ein Design Problem :D

was ist der klassiker ... mvc ... was heißt das?
model -> berechnende Logik ( DB Abfragen, Rechnen )
controller -> gibt der View eine Seele, ( eventhandler .. reaktionen auf input )
View -> die Ansicht


hast du das ?
witzigerweise schon :D
deine View schaut "mager" aus das ist halt dein Ganzes system.input System
Controller ? das ist dein Spiel aber ist es das wirklich ?
model -> du hast die Addieren Klasse , die minus Klasse ( das ist berechnende Logik... wortwörtlich )
( sieh diese NIEMALS als "es gibt nur eine Klasse davon" an ! es gibt jenachdem viele views... viele ocntroller..viele models..)

jetzt läufst du in ein Problem rein ... das "absolute mvc" gibts nicht ... es ist ansich "wie strukturiere ich mein Programm"
( 1: "View" kann auch terminal sein )

es gibt nur um mal so beispiele zu nennen
mvc
mvp
mvvm
mvvcm

als abwandlungen ... und noch ein paar weitere...viele...viele weitere...

du musst für dich fragen stellen wie DU es umsetzt da "pattern" keine Gesetze sondern richtlinien sind
1. wen halte ich dämlich ?
2. wer ist der Chef ?
3. wer kennt wen ?
4. wer muss austauschbar sein ?

das FÜR MICH am einfachste ist folgende struktur "gut"
1. Die View kann nix außer Grafik beinhalten, bekommt den Controller ( da stehen handler drin bzw methoden drin die man ausführen kann wenn dieses oder jenes in der Grafik passiert )
2. der Controller kann das Model anstupsen "mach mal dieses und gib mir das ergebnis ich gebs dann der View passend"
3. das Model ist eine Ansammlung von Klassen / Methoden die ansich keine Logik besitzen, der "Spiel" Ablauf würde bei mir im Controller stehen, das modell ist nur eine Ansammlung von methoden

gut genug gefaselt.. interessiert wahrscheinlich eh niemand wirklich
[CODE lang="java" title="View"]class View{
Button raten;
Label supertext;
View(Controller controller)
{
raten.onaction({
label.setText(controller.sagVersuchRaten());
}
);
}
}[/CODE]
Java:
Controller{
   
    View view = new View(this);
    Model model...( Können hier Ganz viele sein !!! )
       
        Controller{
        initialisieren..
            Random nummer = new Random();
            addierModel = new Addierer(nummer);
           subtrahierModel = new Subtrahierer(nummer);
    }
    public String sagRateSpiel(){
        model.addieren();
        model2.subtrahieren();
        result = ... ;
        return result;
    }
   
}
das model hast du ja schon das sind deine Rechen klassen

soooo was ist jetzt fancy ?
0. ALLE Model klassen sind testbar OHNE einen Controller oder View jemals kreeiert zu haben... das ist hier ein muss für dsa model ... die methoden müssen immer aufrufbar sein UND funktionieren zb
Java:
main {
    Model model = new Model();
    model.methode1();
}
so etwas muss Immer möglich sein... dass ud in der main eine Model Klasse erzeugst und du rufst ( irgendeine... funktioniert nicht immer ) methoden auf dann müssen die funktionieren ... ausgenommen sind zb methoden die vorher einene Aufruf eines setters zuerst brauchen ... dann kannst du "erwarten" dass in einem Test diese Vorher aufgerufen werden..
1. Der Controller richtet sich die Models hin( daran scheiterst du ;) ), und ruft in den Richtigen Reihenfolgen deren Methoden auf ( die logik des spiels ) hier die Methode sagRateSpiel()
2. die View fügt sich selbst zum button den Eventhandler hinzu dh der Controller "kriegt" wenig mit ob die methoden von ihm selbst in der View überhaupt benutzt werden was bringt das??
der Controller ist jetzt auch testbar ohne View
zb in der main erstell ich dne controller und ruf sagRateSpiel auf .. .wird auch funktioinieren und kann geprüft werden
3. ... ich könnte noch weiter erzählen ABER das ist mein mvc ... wahrscheinlich werden es sowieso die meisten hier dämlich finden wie ich es umsetze aber ich weis dass es so hinhaut ... und klar einen Tod stirbt man immer in der IT ... es läuft auch hier nicht alles optimal ( Controller können GIGANTISCH werden .. gleiches problem in mvp soweit ich mich erinnere )
Kneitzel würde dir jetzt wahrscheinlich sagen "nimm mvc her oder besser gleich mvvm"

im prinzip ist es komplett egal was du nimmst oder wie du es baust aber ohne struktur kommst du in ein 5 klassen brauhcen 1e Random Zahl gleichzeitig problem ;)

PS: eine Ansatz des Rnadom wert problems steht in den klassen... nur du bruahcst die Wrapper Klasse Integer ( google selber ) diese ist ein objekt, die referenz teilst du mit den models, und alle modles schauen auf die gleiche zahl
 
M

Mart

Gast
dass du überall in den Models die gleiche Random zahl übergeben musst is dämlich also kannst du da nochmal was drauf setzen und ne factory bauen!
Java:
ReachnerFabrik{
    nummer;
    RechnerFabrik(nummer)
    {
       
    }
    addierer gibMirNeuenAddierer(){
        return new Addierer(nummer);
    }
    subtrahierer gibMirNeuenSubtrahierer(){
        return new Subtrahierer(nummer);
    }
}
dann kannst du diese Fabrik in deinem Controller erstellen und der controller füllt seine Models mithilfe der Fabrik

was bringt dir des jetz? nunja die Fabrik ist eine Mauer! die passt auf dass nix falsches raus kommt, was wäre denn bei dir falsch ?
wenn man 2 untershciedliche werte für die models hernimmt müssen ja die Gleichen sein!
der Controller kann nichts anderes mehr machen außer von der Fabrik models zu verlangen die immer die Gleiche nummer haben
der ganze kladeradatsch funktioniert aber nur mit objekten für die nummer ein int x = 0; reicht NICHT ... du brauchst einen Wrapper


ob du IRGENDWAS von dem was ich geshcrieben hab hernimmst ist mir eig egal es ist wie beim controller... der bietet durch die Public methodne der view sachen an wo die eventhandler gesetzt werden können nach dem "friss oder stirb" prinzip ( das macht auch die Testbarkeit aus nur so nebenbei... wenn du eine Methode testen willst tauscht du die View aus wo nur die 1e Methode behandelt wird )

was du daraus machst ist dein bier, wahrschienlich ist es aber noch zu früh für sowas?
 

mihe7

Top Contributor
MVC ist das klassische EVA-Prinzip - Eingabe, Verarbeitung, Ausgabe - nur eben objektorientiert und kommt ursprünglich aus dem Bereich der UI-Komponenten. Es ist also kein Zufall, dass die Swing-Komponenten selbst diesem Pattern folgen.

Ich habe alles, was mit der Rechnung zu tun hat, Rechenoperationen in einer Klasse gepackt :
Was ist der Sinn dieser Rechenoperationen?
 

Herr.Blacky

Mitglied
Danke! Sehr interessant.
Habe ein komplettes GUI programmiert siehe hier:

Habe GUI und diesen Berechnungscode schon getrennt. Aber MVC ist ja wieder was anderes :).

Die System.out.print Befehle, sind nur zur Kontrolle.


Der Spieler bekommt in einen Fenster Tipps wie " Zufallszahl addiert mit X = 13" und eine 3 Kreuz 3 Matrix, dort ist die Zufallszahl ein X, und die Zeilensummen geben immer 10, was der Spieler erkennen sollte und so rückschließen kann auf die Zufallszahl.

Und noch mehr solche Tipps. Das funktioniert auch alles wunderbar :)

Dann werde ich mir die MVC Struktur mal genauer anschauen.

Habe die Controll Befehle in der Frame-Klasse mit drin, über ActionListener.
 
M

Mart

Gast
ich habe dir eine variante gnenant... ist glaub ich "relativ nah" an mvvm dran ABER du musst irgendwas mahcen IRGENDWAS ansonsten wirds nix.. gefühlt ist das meistens der einzige tipp den man braucht ;)
 

Herr.Blacky

Mitglied
Ja :) das Spiel läuft ja. Jedoch möchte man ja eine saubere Lösung haben. Werde mir das mvvm pattern genauer angucken. Hängt "nur" denke ich an der Programm-Struktur.
 
M

Mart

Gast
ich denke für mvvm braucht man observer dass es gut funktioniert, ka wie das in swing gehen sollte
 

Herr.Blacky

Mitglied
Danke nochmal für die Hilfe!
Habe mich etwas mit Pattern auseinandergesetzt. Denke für mein Programm ist das Singelton-Pattern gut.
In einem MCV- Pattern ist auch ein Oberserve-Pattern drin, richitg ?
Denke für mein nächstes Projekt werde ich es besser machen.
 
M

Mart

Gast
singleton pattern hat mit GUI pattern nichts zu tun, in mvvm ist OBserver Pattern eher drin aber mvvm ist ja auch mvc

observer sind aber ür javafx gedacht ... bzw einfacher da da ALLES über observer gelöst wurde

swing hat soweit ich weis wenig mit obserer am hut
 
Zuletzt bearbeitet von einem Moderator:

mihe7

Top Contributor
observer sind aber ür javafx gedacht ... bzw einfacher da da ALLES über observer gelöst wurde

swing hat soweit ich weis wenig mit obserer am hut
Observer ist ein Pattern, das in beiden Frameworks Verwendung findet.

Der Unterschied liegt hauptsächlich darin, dass die Swing-Komponenten verschiedene Ansätze wählen. Manche Eigenschaften sind JavaBean-Properties, die zwar dem Observer-Pattern folgen aber die "Bindung" von Properties aneinander wird von Swing nicht direkt unterstützt.

Um z. B. die Property "text" eines JLabels zu beobachten:
Java:
label.addPropertyChangeListener("text", event -> System.out.println(event));

In Swing ist das aber nicht durchgängig. Der Text eines Textfelds (z. B. JTextField) ist beispielsweise keine JavaBeans "bound property". Hier wird das das MVC-Pattern umgesetzt, wobei das Model ein Document ist und Änderungen müssen über einen DocumentListener beobachtet werden.

Bei FX gibt es dagegen eigene Klassen, die JavaFX-Properties definieren und die an jeder Ecke verwendet werden. Dafür ist dann z. B. der Text eines TextFields ebenso eine StringProperty wie der Text eines Labels.
 
M

Mart

Gast
außerdem ist dein objekt
Observer ist ein Pattern, das in beiden Frameworks Verwendung findet.

Der Unterschied liegt hauptsächlich darin, dass die Swing-Komponenten verschiedene Ansätze wählen. Manche Eigenschaften sind JavaBean-Properties, die zwar dem Observer-Pattern folgen aber die "Bindung" von Properties aneinander wird von Swing nicht direkt unterstützt.

Um z. B. die Property "text" eines JLabels zu beobachten:
Java:
label.addPropertyChangeListener("text", event -> System.out.println(event));

In Swing ist das aber nicht durchgängig. Der Text eines Textfelds (z. B. JTextField) ist beispielsweise keine JavaBeans "bound property". Hier wird das das MVC-Pattern umgesetzt, wobei das Model ein Document ist und Änderungen müssen über einen DocumentListener beobachtet werden.

Bei FX gibt es dagegen eigene Klassen, die JavaFX-Properties definieren und die an jeder Ecke verwendet werden. Dafür ist dann z. B. der Text eines TextFields ebenso eine StringProperty wie der Text eines Labels.
mnja meines war schlecht ausgedrückt
 

Neumi5694

Top Contributor
Fremde Komponenten zu verändern ist nicht gut.
Deine zweite Klasse sollte nichts vom JLabel wissen, sondern nur, dass das Formular/Panel/WasAuchImmer eine Zahl anzeigen kann. Sprich: Das Formular mit dem Label sollte eine Methode zum Setzen des Wertes anbieten und dann selbst das Label verändern. Und das Ganze natürlich nicht statisch, sondern so, dass man eine Referenz auf die Instanz des Formulars braucht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
C Setter-Methode mit final-Attribut Java Basics - Anfänger-Themen 9
E Methoden Objekte in Methode aufrufen ohne getter und setter? Java Basics - Anfänger-Themen 1
kilopack15 Ist diese setter-Methode richtig? Java Basics - Anfänger-Themen 2
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
N Sprite Methode (Getter, Setter, Konstruktor) Java Basics - Anfänger-Themen 9
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
S Setter Methode von Boolean Java Basics - Anfänger-Themen 11
T Setter Methode Wertebereich eingrenzen Java Basics - Anfänger-Themen 5
F Setter-Methode bei double-Array Java Basics - Anfänger-Themen 6
W Getter/Setter Java Basics - Anfänger-Themen 4
KogoroMori21 Objektvariable anderer Klasse übernehmen, Getter/Setter Java Basics - Anfänger-Themen 11
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
KogoroMori21 Getter und Setter Java Basics - Anfänger-Themen 5
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
V getter/setter Garage Java Basics - Anfänger-Themen 12
S getter, setter in abstrakter Klasse oder lieber Unterklassen Java Basics - Anfänger-Themen 4
topi Kapselung getter und setter Java Basics - Anfänger-Themen 5
D Setter/Getter für Instanzvariablen praktisch? Java Basics - Anfänger-Themen 19
S Getter/Setter - Variablenklasse ? Java Basics - Anfänger-Themen 5
S getter and setter Java Basics - Anfänger-Themen 12
L Getter und Setter Java Basics - Anfänger-Themen 2
JavaTalksToMe Kapselung Setter Frage Java Basics - Anfänger-Themen 15
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
L Klassen - Getter & Setter Methoden Java Basics - Anfänger-Themen 2
D Erste Schritte Java - Setter und Getter Java Basics - Anfänger-Themen 1
T setter im Konstruktor einbauen? Java Basics - Anfänger-Themen 8
Z Getter/Setter NullPointer Exception Java Basics - Anfänger-Themen 6
K Klassen Setter/Getter Java Basics - Anfänger-Themen 3
F OOP Schleifen und Probleme mit Setter und Getter Java Basics - Anfänger-Themen 1
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
K Kapselung getter & setter Java Basics - Anfänger-Themen 11
F Setter Java Basics - Anfänger-Themen 4
gamebreiti Problem mit Setter in Superklasse Verkettung der Kostruktoren??? Java Basics - Anfänger-Themen 7
J Frage zu Setter u. Getter Java Basics - Anfänger-Themen 7
T Variablen Getter-Setter vs Public Variable? Java Basics - Anfänger-Themen 5
Y Konstruktor - Setter/Getter Java Basics - Anfänger-Themen 3
N Setter funktioniert nicht Java Basics - Anfänger-Themen 6
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
K getter & setter Java Basics - Anfänger-Themen 6
M Methoden Problem bei Setter. Java Basics - Anfänger-Themen 2
C getter/setter Problem anscheinend Java Basics - Anfänger-Themen 13
G Erste Schritte Getter und Setter Java Basics - Anfänger-Themen 12
S setter Java Basics - Anfänger-Themen 9
B Getter,Setter - Konstruktor überflüssig? Java Basics - Anfänger-Themen 26
S getter/setter aufrufen Java Basics - Anfänger-Themen 9
B Java getter/setter funktioniert nicht! Java Basics - Anfänger-Themen 7
X OOP Getter/Setter überschreiben den Wert ihrer Variablen nicht Java Basics - Anfänger-Themen 4
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
V public Variablen vs Getter + Setter Java Basics - Anfänger-Themen 4
F Getter und Setter Java Basics - Anfänger-Themen 4
lulas[]args getter/setter umstellung Java Basics - Anfänger-Themen 6
propra Gegenteil von Setter-Methoden Java Basics - Anfänger-Themen 30
A Setter verschachteln? Java Basics - Anfänger-Themen 4
D Kapselung override Setter Java Basics - Anfänger-Themen 5
B Klassen Getter-Setter vor neuem Klassenaufruf - wie? Java Basics - Anfänger-Themen 20
T Variablen fast identische Setter Java Basics - Anfänger-Themen 14
H OOP Setter im Konstruktor um code nicht zu wiederholen? Java Basics - Anfänger-Themen 2
N OOP Getter, Setter und andere Probleme Java Basics - Anfänger-Themen 8
A OOP Getter und Setter Java Basics - Anfänger-Themen 18
L Unterschied Konstruktor / Getter Setter Java Basics - Anfänger-Themen 13
L Setter und Getter für Arrays? Java Basics - Anfänger-Themen 4
N boolean bei Setter und getter methoden Java Basics - Anfänger-Themen 21
N immer Setter-Methoden verwenden? Java Basics - Anfänger-Themen 54
J Getter und Setter auch intern benutzen - guter Stil? Java Basics - Anfänger-Themen 31
U Problem mit setter Java Basics - Anfänger-Themen 17
Houly Setter/Getter MEthoden testen Java Basics - Anfänger-Themen 4
P OOP Getter&Setter Methoden funktionieren nicht Java Basics - Anfänger-Themen 7
S Setter bei Variablen Java Basics - Anfänger-Themen 6
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
H Setter-und-Getter-Konvention Java Basics - Anfänger-Themen 8
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
-horn- EINE setter/getter klasse aus mehreren klassen befüllen Java Basics - Anfänger-Themen 13
C Getter/Setter Java Basics - Anfänger-Themen 61
H Frage zu getter und setter Java Basics - Anfänger-Themen 5
G [Hibernate] Could not find a setter for property Java Basics - Anfänger-Themen 2
S Unbenutzte/überflüssige Getter/Setter herausfinden? Java Basics - Anfänger-Themen 2
M getter/setter bei JTextField ? Java Basics - Anfänger-Themen 21
G warum Setter/Getter Java Basics - Anfänger-Themen 25
S In einer Liste auf getter und setter zugreifen Java Basics - Anfänger-Themen 6
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
T Linked List set-Methode Java Basics - Anfänger-Themen 2
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 6
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben