Objektorientiertes Gui

StupidAttack

Bekanntes Mitglied
Hallo liebe Community

Ich feile gerade an meiner Objektorientierten Programmierung. Ich will nämlich langsam kompliziertere Projekte in Angriff nehmen, muss mir dabei aber erst mal mit versch. Konzepten vertraut machen. Das folgende Programm funktioniert nicht, kann mir jemand helfen?

Java:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
    Model model = new Model();
    String title = "Title String";
    view View  = new view (model, title);
    View.init();
  }
}

Java:
import java.awt.* ;
import javax.swing.* ;
import java.awt.event.* ;

/**
 *
 * @author XX
 */
public class view extends JFrame {
  private Model model;
  private Controller controller;
  protected JLabel  field1;
  protected JButton button;


  public view (Model m, String s) {
    super(s);
    this.model = m;
    this.init();
  }

  public void init() {
    controller = new Controller (this, model);
    setLayout ( new FlowLayout() );
    field1 = new JLabel("HUHU");
    button.addMouseListener(controller);
    add(field1);
    button = new JButton ( "Click to show random number" );
    add (button);

    addWindowListener (controller);
    setSize (300, 200);
    setVisible (true);
  }
}

Java:
public class Model {

  
  private int puffer;
  private  Random generator = new Random( 19580427 );
  private int[]data = new int [10];

  public void generateNumbers () {
  for (int i = 0 ; data.length < 10; i ++ ){
  data[i]=(int)(Math.random()*10);
  }
  }

  

  public void setNumber (int i, int value) {
    i = puffer;
    data[i] = value;
  }

  public int getNumber(int i) {
    return data[i];
  }

}

Java:
import java.awt.* ;
import java.awt.event.* ;

/**
 *
 * @author XXX
 */


public class Controller
    implements MouseListener, WindowListener {
  private Model model;
  private view view;

  public Controller (view v, Model m) {
    this.view = v;
    this.model = m;
  }

  public void mouseClicked  (MouseEvent e) {

  

    String s = String.valueOf(model.getNumber(2));
    view.field1.setText(s);
    
    

  }

  public void mouseExited  (MouseEvent e) {
  }
  public void mouseEntered  (MouseEvent e) {
  }
  public void mouseReleased  (MouseEvent e) {
  }
  public void mousePressed  (MouseEvent e) {

    String s = String.valueOf(model.getNumber(2));
    view.field1.setText(s);
    
    
  }

  public void windowClosing (WindowEvent e) {
    view.dispose();
    System.exit(0);
  }
  public void windowClosed (WindowEvent e) { }
  public void windowOpened (WindowEvent e) { }
  public void windowIconified (WindowEvent e) { }
  public void windowDeiconified (WindowEvent e) { }
  public void windowActivated (WindowEvent e) { }
  public void windowDeactivated (WindowEvent e) { }



}


Fehlermeldung:

run:
Exception in thread "main" java.lang.NullPointerException
at gui.view.init(view.java:32)
at gui.view.<init>(view.java:25)
at gui.Main.main(Main.java:20)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)


Habt ihr eine Idee? Wäre sehr freundlich...

PS: Das Programm beinhaltet einen Knopp und einen Label, auf druch des Knopfes soll das Label durch eine Zufallzzahl beschriftet werden. Da passiert aber nichts. Nun weiss ich nicht obs am Model liegt (sprich an der OOB) oder an den Eventmethoden...da ist eig. das Problem...

edit: das View.init() in der Main class kann man weglassen..doppelt gemoppelt...
 
Zuletzt bearbeitet:

StupidAttack

Bekanntes Mitglied
hihihi

Java:
    add(field1);
    button = new JButton ( "Click" );
    button.addMouseListener(controller);
    add (button);

danke, bei solchen fehlern hilft auch die beste oop nix.
Jetzt bleibt noch abzuklären warum da immer ne 0 als Zufallszahl kommt, hoffentlich gibt diese Frage diesem Thread noch den fehlenden Sinn :oops:
 
G

Gast2

Gast
Java:
generator.nextInt();
liefert immer ne zahl zwischen 0 und 1, das steckst du dann in nen int-array und wird dadurch zur 0.


EDIT:
Das ist natürlich mist ;)
 
Zuletzt bearbeitet von einem Moderator:

andiv

Bekanntes Mitglied
Java:
generator.nextInt();
liefert immer ne zahl zwischen 0 und 1, das steckst du dann in nen int-array und wird dadurch zur 0.

Falsch, Math.rand() liefert einen double zwischen 0 und 1. new Random().nextInt() liefert einen Integer und der ist vielleicht 0 oder 1 aber ganz sicher nicht dazwischen ;-)
 

StupidAttack

Bekanntes Mitglied
Mhh, ich habe jetzt
Java:
public void generateNumbers () {
  for (int i = 0 ; data.length < 10; i ++ ){
  data[i]=(int)(Math.random()*10);
  }
  }

eingebaut, bekomme aber immer noch nur 0 als returnwert zurück (in der getNumber methode der Klasse Model). Woran liegt das? Scheinbar kann ich mein model Objekt nicht verändern. Warum nicht? generateNumbers ist ja nicht falsch, liegt es am kapseln? Bitte um hilfe...

Danke euch
 

kirax

Bekanntes Mitglied
Java:
public void generateNumbers () {
  for (int i = 0 ; data.length < 10; i ++ ){
    data[i]=(int)(Math.random()*10);
  }
}
Das funktioniert so sowieso nicht. Weil data.length == 10 und damit nicht < 10 ist. Die Schleife wird ergo nie ausgeführt.
Nächste Frage: Wo rufst du die Methode denn auf? Theoretisch würde sie im Konstruktor von Model gut passen. Und da die Generierung der Zufallszahlen (offenbar) ein Geheimnis der Klasse Model sind, sollte die Methode auch private sein, statt public.

Probiere es mal so:

Java:
private void generateNumbers() { // zwischen den Methodennamen und die () kommt kein Leerzeichen
  for (int i = 0; i < data.length; i++) {
    data[i] = (int) (Math.random() * 10);
  }
}
// ...
public Model() {
  generateNumbers();
}
 

StupidAttack

Bekanntes Mitglied
hihihihi

Code:
for (int i = 0 ; data.length < 10; i ++ )

Das werde ich mir merken, die Zeile ist genial...hihi---hihihi...:)

klappt ausgezeichnet jetzt, danke dir und auch besten dank für die getsaltungstipps. Und ja du hast auch mit der Kapslung recht...hihihi
 

Ähnliche Java Themen

Neue Themen


Oben