# Java Programm Textbilder



## Niksan (6. Jan 2010)

Hallo alle zusammen 

ich muss hier noch son Programm schreiben, also hier ist erstmal die Aufgabenstellung:

https://sol.cs.hm.edu/course/st/se1a-lab/slide0046.html

( seite von unserem Professor, sicherer zugriff  )

Alsooo

Ich hab schon was zusammen, aber bin mir bei dem was ich hab nicht ganz sicher.

Zum ersten hab ich die Klasse *AbstractImag*:


```
public abstract class AbstractImage implements Image
{
    protected String[] s;
    
    public AbstractImage (String... args)
    {
        s = args;
    }

    public int getHight()
    {
       return s.length;
    }

    public int getWeight()
    {
      String maximum = s [0];
      int i = 1;
      while(i < s.length)
      {
         if (s[i].length() > maximum.length())
         {
            maximum = s[i];
         }
         i++;
      }
      return maximum.length();
    }

    public String getLine(int i)
    {
     return s[i];
    }
}
```

Dann dir Klasse *Text*:


```
public class Text extends AbstractImage
{

    public Text (String... args)
    {
       super (args);
    }
 
    @Override
    public String toString()
    {
    String newline = "\n";
    String result = "";
    if (s.length > 0) {
        result = s[0];    // start with the first element
        for (int i = 1; i < s.length; i++) {
            result = result + newline + s[i];
        }
    }
    return result;
    }

    public void setLine(int i,String w)
    {
        s[i] = w;
    }
}
```

Nun die Klasse *Modern*

```
public class Modern extends AbstractImage
{
    private final char c;
    private int height;
    private int weight;

    public Modern (char c, int height, int weight)
    {
        this.c = c;
        this.height = height;
        this.weight = weight;
    }
    
    public void setHeight (int i)
    {
        this.height = i;
    }   
    
    public void setWidth(int i)
    {
        this.weight = i;
    }

  
    @Override
    public String toString()
     {
        String newline = "\n";
        String result = "";
    
        int k = 0;
        while(k < this.height)
            {        
            for(int l = 0; l < this.weight; l++)
            result = result + c;
        
            result = result + newline;
            k++;
    }
    return result;
    }
}
```
 Klasse *Framed*:


```
public class Framed extends AbstractImage
{
    
    private final Image image;
    
    public Framed (Image image)
    {
        this.image = image;
    }

    @Override
    public String toString()
    {
        int x;
        int y;

        System.out.print("+");
            for (x = 0; x < image.getWeight(); x++)
            {
                System.out.print("-");
            }
        System.out.println("+");

        for (int q = 0; q < image.getHight(); q++)
            {
            String d ="";
            if (image.getLine(q).length() != image.getWeight())
                {
                for (int e = image.getLine(q).length(); e != image.getWeight(); e++)
                d = d + " ";
                }
        System.out.println("|" + image.getLine(q) + d + "|");
        }

        System.out.print("+");
        for (x = 0; x < image.getWeight(); x++)
            {
                System.out.print("-");
            }
        System.out.print("+");
        return "";
    }
}
```


Sooo das hätte ich schonmal, hab jedoch noch paar Fragen.

1. Ich bin nicht sicher ob diese Implimentierung so gerecht ist. Ich meine ich weiss nicht ob man die Klasse "Modern" auch so schreiben soll, dass die Objekte von "Modern" wie die Objekte vom "Text" zusammengestellt werden, also mit Arrays.

2. Denn später muss ich ja in "Above" und so  2 bilder untereinander bzw. nebeneinander schreiben, hab da mal rumprobiert z.B. so:


```
public class Above extends AbstractImage
{
    private final Image image1;
    private final Image image2;
    
    public Above (Image image1, Image image2)
    {
        this.image1 = image1;
        this.image2 = image2;
    }

    @Override
    public String toString()
     {
         System.out.println(image1);
         System.out.println(image2);

        return "";
     }

}
```

theoretisch funkt es, ABER es muss ja daraus 1 Bild entstehen, also aus 2 obj. soll dann 1, zusammengewachsen sein, dass man dann auch Framen kann. Also so dachte ichs mir: (testklasse):


```
public class TT {

    public static void main(String[] args)
    {
        Text mw = new Text("München", "im", "Winter");
        

        Modern snow = new Modern('*', 8000000, 5000000);    // ein Monumentalgemälde
        snow.setWidth(4);
        snow.setHeight(3);


        Above d = new Above(mw, snow);
        System.out.println(d);     

        Framed a = new Framed(d);
        System.out.println(a);
    }
}
```

dabei kassier ich aber immer folgendes:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at AbstractImage.getWeight(AbstractImage.java:27)
        at Framed.toString(Framed.java:20)
        at java.lang.String.valueOf(String.java:2826)
        at java.io.PrintStream.println(PrintStream.java:771)
        at TT.main(TT.java:26)
Java Result: 1

So bin ich auf die idee gekommen, dass vielleicht die beiden einzelnen bilder nicht o kompotabel sind dass man daraus 1 machen kann, und zwar so dass man es umrahmen kann ...

Jedoch habe ich keine Ahnung wie ich das anders machen soll, bzw. wo hier was nicht zusammenpasst, und wo fehler sind.

3. Zu den anderen Klassen, passen die soweit ? Kann man noch irgendwas in die Abstracte Klasse hochziehen ?!

4. Ok zu den restlichen Klassen habe ich leider garkeine Idee ... fals da einem was so einfällt wäre cool 

Aber eins nachm anderen, erstmal die sachen davor ausbessern bevor man weitermacht 

Vielen Dank jetztschonmal für dir Zeit 
So glaub dieser Roman reicht jetzt erstmal


----------



## javimka (6. Jan 2010)

Ohne deine 6 Klassen genauer betrachtet zu haben, deine ArrayIndexOutOfBoundsException tritt in der Klasse AbstractImage in der Methode getWight (siehe StackTrace der Exception) auf, nämlich bei der Stelle [c]String maximum = s [0];[/c]
Auf s speicherst du die Argumente, die die main erhalten hat. Sind aber keine Argumente dabei, gibt es kein Element s[0], dies füht zur Exception.


----------



## Niksan (6. Jan 2010)

yo schon, weiss halt nicht so recht wie ichs beheb soll, kann es vielleiccht daran liegen, dass die Klasse Modern nicht so wie die klasse Text implimentiert ist, also mit Array ?!


----------



## javimka (6. Jan 2010)

Nein, die Exception hat nichts damit zu tun. Die tritt nur auf, weil du auf s[0] zugreifst, obwohl dieses nicht existiert. Was soll denn getWeight() zurückgeben, wenn s kein einziges Element enthält? Falls es 0 zurückgeben soll, kannst du als am Beginn der Methode schreiben: [c]if (s.length==0) return 0;[/c]. Noch besser wäre es natürlich, wenn du sicherstellen würdest, dass s gar nie leer ist. D.h. direkt in der Main prüfen, ob args leer ist und falls ja, Programm sofort mit Fehlermeldung beenden.


----------

