# RGB-Werte aus einem String einlesen



## F_A_U_S_T (8. Dez 2017)

Guten Abend die Gemeinschaft!

ich würde mich sehr freuen wenn sie mir hierbei helfen würden da ich seit ein paar Tagen stecken geblieben bin.
Folgendes Problem:
ich habe eine Textdatei, die ich bereits in den BufferedReader eingelesen habe. Mein Problem ist jedoch die Werte von RGB-Farben für die JButtons zuzuweisen.

So sieht die Text-Datei aus:

141 141 141 141 141 141 141 141 141
131 131 131 131 0 0 255 128 255  128
128 128 128 128 128 128 128 128 128 

zwischen den Werten steht jeweils ein Leerzeichen. Ich habe bereits versucht diese mit split(" "); Funktion zu teilen was auch geklappt hat. Das bringt mir aber nichts da die Anzahl von JButtons und somit auch von RGB-Werten in einer Datei varrieren kann. (wenn ich beispielsweise eine andere Text-Datei habe). Außerdem sollten zu jedem JButton 3 x RGB-Werte zugeteilt werden um die Farbe(beispielsweise Blau) anzeigen zu lassen.
Hat jemand Ideen wie ich am besten das Problem lösen kann? 

Vielen Dank im Voraus!

```
JFileChooser chooser = new JFileChooser();
          int rueckgabeWert = chooser.showOpenDialog(null);

          if (rueckgabeWert == JFileChooser.APPROVE_OPTION) {


              File selectedFile = chooser.getSelectedFile();
              FileReader fr = new FileReader(selectedFile);
              BufferedReader br = new BufferedReader(fr);
             
                   
                  String rest = "";
         
                      while( (rest = br.readLine()) != null ) {
                      }

                      }

                      br.close();
                     
          }
        return false;

}
```


----------



## krgewb (9. Dez 2017)

Ist das die Farbe des ersten Buttons? 
(141, 141, 141)

Oder das?
(141, 131, 128)


----------



## F_A_U_S_T (9. Dez 2017)

krgewb hat gesagt.:


> Ist das die Farbe des ersten Buttons?
> (141, 141, 141)
> 
> Oder das?
> (141, 131, 128)


Hi,

es sollten 5 Spalten und 3 Zeilen sein. Damit sind die Werte für ein JButton 141, 141, 141. Die schleifen für die buttons habe ich bereits.


----------



## krgewb (9. Dez 2017)

Da stimmt etwas nicht. Die folgende Zeile enthält 10 Werte:

```
131 131 131 131   0   0 255 128 255 128
```

Wie dem auch sei. Angenommen du hast folgendes:

```
141 141 141 141 141 141 141 141 141
131 131 131 131   0   0 255 128 255
128 128 128 128 128 128 128 128 128
```
In einer Zeile:

```
141 141 141 141 141 141 141 141 141 131 131 131 131 0 0 255 128 128 128 128 128 128 128 128 128 128 128
```
In einem Array oder einer ArrayList:

```
141
141
141
141
141
141
141
141
141
131
131
131
131
0
0
255
255
128
128
128
128
128
128
128
128
128
128
```
27 Zeilen
27 / 3 = 9
-> Also neun Buttons

Immer in dreier-Schritten:
Indizes vom r-Wert sind somit:  0,3,6,9,12,15,18,21,24
Indizes vom g-Wert sind somit: 1,4,7,10,13,16,19,22,25
Indizes vom b-Wert sind somit: 2,5,8,11,14,17,20,23,26


----------



## F_A_U_S_T (9. Dez 2017)

> Immer in dreier-Schritten:
> Indizes vom r-Wert sind somit:  0,3,6,9,12,15,18,21,24
> Indizes vom g-Wert sind somit: 1,4,7,10,13,16,19,22,25
> Indizes vom b-Wert sind somit: 2,5,8,11,14,17,20,23,26



Hey, danke für diese Idee.

Ich habe jetzt folgendes zusammengebaut:

```
while( (rest = br.readLine()) != null ) {
                          String [] partsX = rest.split(" ");
                          for(int i = 0; i < partsX.length; i = i + 3) {
                               Integer red = Integer.valueOf(partsX[i]);
                               int r = red;
                               System.out.print(r);
                          }
                          for(int j = 1; j < partsX.length; j= j + 2) {
                              Integer green = Integer.valueOf(partsX[j]);
                              int g = green;
                              System.out.println(partsX[j]);
                            
                          }
                        
                      }
```
das sollten die Werte für Rot und Grün sein. Bei der ersten Schleife lauft auch alles soweit. Die zweite mekert mit folgendem Fehler:
12825501280Exception in thread "main" java.lang.NumberFormatException: For input string: "128    128"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)
    at Coordinates.loadFromFile(Coordinates.java:159)
    at MAIN.main(MAIN.java:19)
ich vermute wegen der Funktion split(" "); da ich den String nach jedem Leerzeichen aufgeteilt habe und in der Text-Datei diese 0-Werte existieren, welche mit mehr als einem Leerzeichen getrennt sind. Hast du da auch eventuell Ideen wie ich das umgehen kann?


----------



## krgewb (9. Dez 2017)

Ach herrje! Du hast Recht. Bei folgendem String:

```
131 131 131 131   0   0 255 128 255
```
wird gespeichert:

```
131
131
131
131


0


0
255
128
255
```
Du musst also die Leerzeilen wegbekommen. Das geht am besten mit einer ArrayList.
Mit einem neuen Array geht es auch. Dazu musst du zuerst die Anzahl der Leerzeilen zählen.

```
public class Hauptprogramm {

    public static void main(String[] args) {

        String rest = "131 131 131 131   0   0 255 128 255";

        String[] partsX = rest.split(" ");

        int anzahlLeerzeilen = 0;

        for (int i = 0; i < partsX.length; i++) {
            if (partsX[i].isEmpty()) {
                anzahlLeerzeilen++;
            }
        }

        String[] partsX_neu = new String[partsX.length - anzahlLeerzeilen];

        int zaehler = 0;

        for (int i = 0; i < partsX.length; i++) {
            if (!partsX[i].isEmpty()) {
                partsX_neu[zaehler] = partsX[i];
                zaehler++;
            }
        }

        System.out.println("r:");

        for (int i = 0; i < partsX_neu.length; i = i + 3) {
            int r = Integer.valueOf(partsX_neu[i]);
            System.out.println(r);
        }

        System.out.println("\ng:");

        for (int i = 1; i < partsX_neu.length; i = i + 3) {
            int g = Integer.valueOf(partsX_neu[i]);
            System.out.println(g);
        }

        System.out.println("\nb:");

        for (int i = 2; i < partsX_neu.length; i = i + 3) {
            int b = Integer.valueOf(partsX_neu[i]);
            System.out.println(b);
        }

    }
}
```

Ausgabe:

```
r:
131
131
255

g:
131
0
128

b:
131
0
255
```


----------



## krgewb (9. Dez 2017)

Edit:
Die Zeile war noch falsch:

```
for(int j = 1; j < partsX.length; j= j + 2) {
```
Da muss eine 3 hin.


----------



## krgewb (9. Dez 2017)

Verstehst du meinen Code?

Hier noch eine kürzere Version (eben mit einer ArrayList):

```
import java.util.ArrayList;

public class Hauptprogramm {

    public static void main(String[] args) {

        String rest = "131 131 131 131   0   0 255 128 255";

        String[] partsX = rest.split(" ");

        ArrayList<String> partsX_neu = new ArrayList<String>();

        for (int i = 0; i < partsX.length; i++) {
            if (!partsX[i].isEmpty()) {
                partsX_neu.add(partsX[i]);
            }
        }

        System.out.println("r:");

        for (int i = 0; i < partsX_neu.size(); i = i + 3) {
            int r = Integer.valueOf(partsX_neu.get(i));
            System.out.println(r);
        }

        System.out.println("\ng:");

        for (int i = 1; i < partsX_neu.size(); i = i + 3) {
            int g = Integer.valueOf(partsX_neu.get(i));
            System.out.println(g);
        }

        System.out.println("\nb:");

        for (int i = 2; i < partsX_neu.size(); i = i + 3) {
            int b = Integer.valueOf(partsX_neu.get(i));
            System.out.println(b);
        }

    }
}
```


----------



## mrBrown (9. Dez 2017)

Warum so kompliziert?

Einfach die Datei Zeilenweise einlesen, dann hat man drei Strings.
Die drei Strings jeweils splitten am Leerzeichen, dann hat man drei gleich lange Arrays.

Die Länge der Arrays ist die Anzahl der Buttons.
Die Rot ist das erste Array, Grün das Zweite, Blau das Dritte - jeweils die drei am gleichen Index gehören zusammen.


----------



## krgewb (9. Dez 2017)

Das Leerzeichen ist ja das Problem.


----------



## mrBrown (9. Dez 2017)

Das könnte man wunderbar mit einem passendem Regex beim Split mitentfernen lassen


----------



## krgewb (9. Dez 2017)




----------



## F_A_U_S_T (10. Dez 2017)

krgewb hat gesagt.:


> Ach herrje! Du hast Recht. Bei folgendem String:
> 
> ```
> 131 131 131 131   0   0 255 128 255
> ...


Ich danke dir, die Lösung hat geklappt. Ich habe gestern noch versucht mit Pattern und Matcher die Zahlen rauszuziehen.. Dann die Leerzeichen zu umgehen mit [ \t] hat aber nicht viel gebracht.


----------



## mrBrown (10. Dez 2017)

Die gesamte Datei auf einmal einlesen, die Zeilen jeweils an allen nicht-Zahlen splitten, übrig bleiben dann nur die Zahlenwerte, und dann einfach Indexbasiert drauf zugreifen. (Fehlerbehandlung der Einfachheit halber weggelassen)


```
List<String> lines = Files.readAllLines(Paths.get("..."));

        List<String[]> arrays = new ArrayList<>(3);
        for (final String line : lines) {
            arrays.add(line.split("\\D+"));
        }

        for (int i = 0; i < arrays.get(0).length; i++) {
            System.out.printf("R: %d, G: %d, B: %d%n",
                    Integer.valueOf(arrays.get(0)[i]),
                    Integer.valueOf(arrays.get(1)[i]),
                    Integer.valueOf(arrays.get(2)[i]));
        }
```

Ließe sich vermutlich mit Streams noch optimieren.

Gibts eigentlich ein Äquivalent zu `zip` in Java?
Ansonsten kann man sich ein generisches basteln, dann ists im wesentlichen ein aneinanderreihen von einlesen, splitten, zippen und parsen.


----------



## F_A_U_S_T (16. Dez 2017)

Hallo zusammen, da bin ich wieder.
Leider klappt es nicht diese Werte für die JButtons zuzuordnen. Ich kriege zwar die R, G, B - Werte als eine Liste ausgespuckt aber wie ich jeweils 3 davon (das sind damit ja mehrere Farben) den jeweils einzelnen JButtons zuordne ist mir immer noch ein Rätsel.  Ich freue mich über neue Ideen da ich leider keine mehr habe.
141 141 141 141 141 141 141 141 141
131 131 131 131     0    0  255 128 255
128 128 128 128 128 128 128 128 128
Danke im Voraus.


----------



## truesoul (17. Dez 2017)

F_A_U_S_T hat gesagt.:


> Hallo zusammen, da bin ich wieder.
> Leider klappt es nicht diese Werte für die JButtons zuzuordnen. Ich kriege zwar die R, G, B - Werte als eine Liste ausgespuckt aber wie ich jeweils 3 davon (das sind damit ja mehrere Farben) den jeweils einzelnen JButtons zuordne ist mir immer noch ein Rätsel.  Ich freue mich über neue Ideen da ich leider keine mehr habe.
> 141 141 141 141 141 141 141 141 141
> 131 131 131 131     0    0  255 128 255
> ...



Verstehe deine Beschreibung nicht ganz. 
Also du bekommst für Daten korrekt ausgelesen? 
Die Daten sind in drei Arrays verteilt? 
Jetzt weißt du nur nicht wie man die Farbe vom Buttons ändern kannst?

Grüße


----------



## F_A_U_S_T (17. Dez 2017)

truesoul hat gesagt.:


> Verstehe deine Beschreibung nicht ganz.
> Also du bekommst für Daten korrekt ausgelesen?
> Die Daten sind in drei Arrays verteilt?
> Jetzt weißt du nur nicht wie man die Farbe vom Buttons ändern kannst?
> ...


Hey, ich habe einen ArrayList mit folgenden RGB -Werten die, die Konsole mit ausgibt:
r:
141
141
141

g:
141
141
141

b:
141
141
141

r:
131
131
255

g:
131
0
128

b:
131
0
255

r:
128
128
128

g:
128
128
128

b:
128
128
128

Somit sind es 9 x JButtons für welche die Farbwerte jeweils einzeln bestimmt sind(bestehen beispielsweise aus r=131, g=0, b=0). Was ich nicht verstehen kann, wie ich diese Werte den einzelnen JButtons zuordnen kann. Währen die Farben und die JButtons nicht variabel, könnte ich diese jeweils einzeln zuordnen aber das ist leider nicht der Fall da die Anzahl und somit die Werte in der Textdatei variieren können.


----------



## mrBrown (17. Dez 2017)

F_A_U_S_T hat gesagt.:


> Hey, ich habe einen ArrayList mit folgenden RGB -Werten die, die Konsole mit ausgibt:


Die Ausgabe sieht ziemlich Unsinnig aus...die Betitelung mit reg & b passt überhaupt nicht...



F_A_U_S_T hat gesagt.:


> Somit sind es 9 x JButtons für welche die Farbwerte jeweils einzeln bestimmt sind(bestehen beispielsweise aus r=131, g=0, b=0). Was ich nicht verstehen kann, wie ich diese Werte den einzelnen JButtons zuordnen kann. Währen die Farben und die JButtons nicht variabel, könnte ich diese jeweils einzeln zuordnen aber das ist leider nicht der Fall da die Anzahl und somit die Werte in der Textdatei variieren können.


Du musst doch zumindest wissen, welcher Button zu welchem Farbwert gehören soll?
Der erste Button die erste Farbe?
Gibts gleich viele Buttons wie Farben?


----------



## F_A_U_S_T (17. Dez 2017)

mrBrown hat gesagt.:


> Die Ausgabe sieht ziemlich Unsinnig aus...die Betitelung mit reg & b passt überhaupt nicht...
> 
> 
> Du musst doch zumindest wissen, welcher Button zu welchem Farbwert gehören soll?
> ...


Der erste Button sollte beispielsweise die Farben [r=141, g=141,b=141] zugewiesen bekommen. Es gibt genau so viel Farbwerte, wie die Buttons. Sprich wenn es 9 Buttons sind, so sollten in der Textdatei 9 x 3 = 27 RGB Werte stehen.


----------



## truesoul (17. Dez 2017)

Hmmm. Sind es immer 9 Buttons? 
Oder sind so viele Buttons wie es farbwerte gibt?


----------



## mrBrown (17. Dez 2017)

F_A_U_S_T hat gesagt.:


> [r=141, g=141,b=141]


Diesen Farbwert gibt es in der Datei nicht (oder du hast völlig falsch erklärt, wie die aufgebaut ist).

Edit: ist doch so wie du sagtest - aber bist du die sicher damit? Das ist das dämlichsten Encoding was ich mir vorstellen kann...


----------



## F_A_U_S_T (17. Dez 2017)

truesoul hat gesagt.:


> Hmmm. Sind es immer 9 Buttons?
> Oder sind so viele Buttons wie es farbwerte gibt?


Hey, es sind so viele Buttons wie es Farbwerte gibt. Wenn wir z.B. diese Textdatei nehmen:
141 141 141 141 141 141 141 141 141 - so sind in diese Reihe 3 x Buttons mit den Werten [r =141, g = 141, b =141]
131 131 131 131     0    0 255 128 255
128 128 128 128 128 128 128 128 128


----------



## mrBrown (17. Dez 2017)

Grob: Buttons in eine List, Farben in eine Liste, und jeweils button[i] bekommt farbe[i]


----------



## F_A_U_S_T (17. Dez 2017)

mrBrown hat gesagt.:


> Diesen Farbwert gibt es in der Datei nicht (oder du hast völlig falsch erklärt, wie die aufgebaut ist).
> 
> Edit: ist doch so wie du sagtest - aber bist du die sicher damit? Das ist das dämlichsten Encoding was ich mir vorstellen kann...


Hast du da andere Ideen wie man das anders machen könnte?


----------



## truesoul (17. Dez 2017)

Ok. Dafür müsstest du 
	
	
	
	





```
new Color(r, g,  b)
```
 verwenden. Und die Hintergrundfarbe jedes Buttons damit setzen.

Warum muss die Datei so aufgebaut sein? Ich finde es ziemlich bescheiden.


----------



## mrBrown (17. Dez 2017)

F_A_U_S_T hat gesagt.:


> Hast du da andere Ideen wie man das anders machen könnte?


Entweder

```
R G B
R G B
R G B
R G B
```

Oder

```
R R R R
G G G G
B B B B
```

Oder haben Zeilen/Spalten bei dir bisher eine Bedeutung?


----------



## truesoul (17. Dez 2017)

Also eine Struktur wie XML oder zumindest csv wäre Sinnvoll. 


```
<colors>
<color>
<r>141</r>
<g>131</g>
<b>255</b>
</color>
....
</colors>
```

Oder wie es @mrBrown im ersten Beispiel gezeigt hat.


----------

