# source folder und code highlighting IntelliJ



## LouCyphre (11. Nov 2022)

Zwei kurze Fragen: 

1. was ist in IntelliJ nochmal der Source Folder, wo man Grafiken etc. ablegt?
intuitiv habe ich resource bundle gewählt, allerdings kommt da nicht raus was ich erwartet habe...

2. Beim snippet werden lediglich die bools und die Konstante gehighlightet ( und new ) sonst nix, warum ist das nochmal so?


```
import javax.swing.JFrame;   
    
       //...

        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        window.setTitle("Test");

        GamePanel gamePanel = new GamePanel();
        window.add(gamePanel);
```


----------



## Hansen_07 (11. Nov 2022)

LouCyphre hat gesagt.:


> 1. was ist in IntelliJ nochmal der Source Folder, wo man Grafiken etc. ablegt?
> intuitiv habe ich resource bundle gewählt, allerdings kommt da nicht raus was ich erwartet habe...


*src/main/resources* sollte der Standardordner sein. Fehlt dir dieser, dann rechter Mausklick auf das Project, dann New/Directory und dir werden dann die Standardverzeichnisse zur Auswahl angezeigt.


----------



## LouCyphre (11. Nov 2022)

Mhh, leider nicht. Über Project -> New -> Directory kann ich nur ein neues Directory anlegen.
Darüberhinaus will ich auch in einem package ein source folder anlegen und da die .png parken, wie wäre das denn möglich?


----------



## Hansen_07 (11. Nov 2022)

Hm, dann lege dir einfach einen Ordner mit dem Namen resources unter src/main an. Standard ist - soweit ich weiß - eigentlich immer die Ordnerstruktur die das Buildtool Maven vorgibt. Auch für Projekte, die selbst nicht Maven nutzen. 

Mehr dazu hier.


----------



## LouCyphre (11. Nov 2022)

dummerweise habe ich auch kein scr/main  
Das habe ich gelöscht und die main in die Klasse App geschrieben...

Darüberhinaus will ich auch in einem package ein source folder anlegen und da die .png parken, wie wäre das denn möglich?
Ist das überhaupt sinnvoll?


----------



## Hansen_07 (11. Nov 2022)

Möglich ist eine ganze Menge und sinnvoll ist es, meiner Ansicht nach, sich an Standards und Konventionen zu halten.

Klar, die _Methode_ *main *in der Klasse App ist völlig ok. Der _Ordner_ main hat ja rein gar nichts mit der Methode gleichen Namens zu tun.

Die packages mit dem sourcecode legt man eigentlich im Order _src/main/java/_ an. Wenn du das aber partout so nicht möchtest, dann lege die packages dort an wo du magst.

Und ja, du kannst in ein package auch Bilder, Musikdateien oder Exceldokumente packen. Allerdings gibt es nicht ohne Grund Konventionen, die sich in grauer Vorzeit wirklich kundige Menschen mal ausgedacht haben.

Quintessenz: solange der Compiler nicht meckert, kannst du machen was du willst, egal wie sinnvoll das ist.


----------



## LouCyphre (11. Nov 2022)

Ich bin ja was die Conventionen angeht ganz bei dir. Allerdings kommt mir das ein bisschen IDE spezifisch vor. Die Frage ist: meinst du mit Ordner main ein package oder ein directory? Ich habe nur die Main Klasse gelöscht und es gab nie einen Ordner main.

Der Punkt ist, ich ziehe gerade mit dem Projekt von Eclipse zu IntelliJ um und in Eclipse gibt es source folder wo man so was reinpackt und für mich ist ein package irgendwie kein Equivalent dafür und ich finde auch so kein anderes, außer das von dir beschriebene  *src/main/resources* was es aber nicht gibt und nicht wiederherstellbar ist.


----------



## Hansen_07 (11. Nov 2022)

LouCyphre hat gesagt.:


> Ich bin ja was die Conventionen angeht ganz bei dir. Allerdings kommt mir das ein bisschen IDE spezifisch vor. Die Frage ist: meinst du mit Ordner main ein package oder ein directory? Ich habe nur die Main Klasse gelöscht und es gab nie einen Ordner main.



Ein package betrachte ich nie als Folder/Directory/Ordner, es ist ein package.


LouCyphre hat gesagt.:


> Der Punkt ist, ich ziehe gerade mit dem Projekt von Eclipse zu IntelliJ um und in Eclipse gibt es source folder wo man so was reinpackt und für mich ist ein package irgendwie kein Equivalent dafür und ich finde auch so kein anderes, außer das von dir beschriebene  *src/main/resources* was es aber nicht gibt und nicht wiederherstellbar ist.


Die IDE ist ansich völlig egal. Die Maven Konvention ist völlig unabhängig von Eclipse, IntellijIDEA oder was auch immer. Und wenn die Folder nicht vorhanden waren, kannst du sie einfach selber anlegen. Es sind nur Ordner um dein Projekt zu strukturieren. 
Wie genau du dein Project in IntelliJ angelegt hast, weiß ich ja gar nicht. Es gibt da ja viele Varianten. Ein leeres Project, ein Template, ein Maven Project etc. 

Ich persönlich erstelle immer ein Maven Project, da kann ich dann sofort loslegen.


----------



## KonradN (11. Nov 2022)

Also IntelliJ kann mit diversen Projekten umgehen. Da ist dann immer die Frage, was für ein Projekt Du hast.

Bei *Maven* und *Gradle* sind die Verzeichnis überlicherweise:

src/main/java für Java Sourcen
src/main/resources für Ressourcen wie Bilder und so

Bei *Eclipse* Projekten (die kann man nicht erzeugen, aber IntelliJ kann diese erzeugen) liegt alles in src: Sourcen und Ressourcen sind hier alle zusammen.

Die typischen *IntelliJ* Projekte haben keine festen Vorgaben. Beim erzeugen wird ein Verzeichnis src erzeugt und als Source Verzeichnis markiert.
Das Prinzip ist also, dass man beliebige Verzeichnis als spezielles Verzeichnis markiert. 
Daher kannst Du Dir nun überlegen, wo Du Ressourcen ablegen willst. Das kann ein beliebiges Verzeichnis sein.
Im Project Fenster einfach Rechtsklick auf das Verzeichnis und dann Mark Directory as -> Resources Root
Das geht aber nur, wenn es noch nicht markiert ist! Ansonsten wird die bisherige Markierung gelöscht und die letzte genommen.


*Generell ist meine Empfehlung, auf Maven oder Gradle zu setzen. *Das hat den großen Charm, dass man Einstellungen problemlos teilen kann. Bei Problemen ist es halt einfacher, die pom.xml weiter zu geben als in vielen Fenstern die Einstellungen zusammen zu suchen.


----------



## LouCyphre (11. Nov 2022)

Ich habe jetzt nochmal auf* maven* umgestellt. Und die von @Hansen_07 beschrieben Ordnerstrukuren sind jetzt da! Yeah!

Jetzt habe ich allerdings immernoch das Problem, was mich eigentlich zum Post geführt hat ( ich hoffe des sprengt nicht den Rahmen des Threat ),
lädt es die Grafik dennoch nicht, weil es scheinbar " null " zurück gibt. Was komisch ist, weil es unter Eclipse funktioniert hat.


```
public BufferedImage test;

 test = ImageIO.read(getClass().getResourceAsStream("test.png"));
```

_test.png _ist jetzt in *src/main/resources.*

Aber Danke schonmal bis hier her!


----------



## KonradN (11. Nov 2022)

Vermutlich ist die Klasse in einem Package. Wenn Du eine Klasse in einem Package a.b hast, dann wird relativ vom Verzeichnis a/b aus gesucht. Statt einer relativen Angabe kannst Du eine absolute machen und den Pfad ab dem Ressource Ordner angeben:
`ImageIO.read(getClass().getResourceAsStream("/test.png"));`


----------



## LouCyphre (11. Nov 2022)

Das habe ich auch erst vermutet, aber auch

```
test = ImageIO.read(getClass().getResourceAsStream("src/main/resources/test.png"));
```
findet nichts.
Wenn ich aber über die gebliche Markierung im Editor hover, zeigt es mir die Grafik an.

und /test.png habe ich auch versucht


----------



## KonradN (11. Nov 2022)

Stimmt die Gross-/Kleinschreibung? Die Datei ist in src/main/resources und Du gibst nur getResourceAsStream("/test.png") an?


----------



## LouCyphre (11. Nov 2022)

Nunja, ich habe beide Versionen versucht. Den Pfad habe ich direkt aus dem Ordner mit _copy path_ geholt.


----------



## KonradN (11. Nov 2022)

Sorry, aber irgend etwas stimmt nicht. Wie der Code aussehen muss, habe ich klar gesagt. Was Du da mit "copy path" versucht hast, erschließt sich mir nicht, denn es ist kein Pfad zu kopieren oder anzugeben. 

Wenn es nicht geht, dann besteht die Möglichkeit, dass die Datei anders heisst. Oder es ist irgend etwas anderes nicht stimmig. Aber ohne genaue Informationen können wir nicht sagen, was falsch ist. Ich kann nur sagen, wie es gehen würde.


----------



## LouCyphre (11. Nov 2022)

Okay.


KonradN hat gesagt.:


> ImageIO.read(getClass().getResourceAsStream("/test.png"));


habe ich versucht. Die Benennungen stimmen soweit alle.

ich habe jetzt mal den hint von IntelliJ genutzt und


```
test = ImageIO.read(Objects.requireNonNull(getClass().getResourceAsStream("/test.png")));
```

versucht. Das funktioniert. Aber ist ja nicht wirklich sauber oder?

Was werden denn noch für Infos gebraucht?

Mit copy path wollte ich nur verdeutlichen, dass es an der Schreibweise nicht liegen kann, weil ich sie aus dem resources, wo die .png liegt kopiert habe.


----------



## KonradN (11. Nov 2022)

KonradN hat gesagt.:


> Was Du da mit "copy path" versucht hast, erschließt sich mir nicht, denn es ist kein Pfad zu kopieren oder anzugeben.


Ok, das wird diese Funktionalität "Copy Path/Reference" im Kontextmenü gewesen sein ... dann ist der Dateiname richtig.

Wie startest Du es? Ggf. mal mit maven richtig bauen lassen (also ein mvn clean package oder so).

Wenn es aus IntelliJ gestartet wird: Ist der resource Order in IntelliJ auch als Resource Ordner gekennzeichnet (Da hat der Ordner so im Symbol unten rechts noch orangene Linien als Stapel im Symbol ...) - Nicht dass IntelliJ da das Maven Projekt nicht richtig interpretiert hat. Da hilft ggf. auch ein Rechtsklick auf das Projekt mit Auswahl Maven -> Reload Project

Oder mach mal ein Bildschirmfoto, dass Dein IntelliJ zeigt mit Project Fenster, dem Code, der Fehlermeldung und so ...


----------



## KonradN (11. Nov 2022)

LouCyphre hat gesagt.:


> Das funktioniert. Aber ist ja nicht wirklich sauber oder?


Moment - was funktioniert? Das macht ja nichts, außer auf Null zu prüfen. Dann wird die NPE halt von Objects.requireNonNull geworfen.

Wenn das mit dem Objects,requireNonNull funktioniert, dann funktioniert es auch ohne. Dann hast Du beim Ausprobieren nur etwas falsch gemacht und Dich irgendwo vertippt.


----------



## yfons123 (11. Nov 2022)

KonradN hat gesagt.:


> Bei *Eclipse* Projekten


du kannst ein maven projekt erstellen was dir automatisch die ordner erzeugt für maven...


----------



## LouCyphre (11. Nov 2022)

KonradN hat gesagt.:


> Moment - was funktioniert? Das macht ja nichts, außer auf Null zu prüfen. Dann wird die NPE halt von Objects.requireNonNull geworfen.
> 
> Wenn das mit dem Objects,requireNonNull funktioniert, dann funktioniert es auch ohne. Dann hast Du beim Ausprobieren nur etwas falsch gemacht und Dich irgendwo vertippt.


Ich bin dahingehend ratlos. 
Die .png ist in besagten Ordner mit dem Linien Stapel.
Ich habe lediglich den Vorschlag von IntelliJ benutzt und jetzt wird es geladen. 


ich habe auch das maven reloadet.


----------



## LouCyphre (11. Nov 2022)

Okay! Danke!

Ich habe das Projekt jetzt nochmals neu aufgesetzt und jetzt funktioniert es.

Sorry für die gelassenen Nerven und danke für den Support!

Keine Ahnung wo der Fehler lag, aber jetzt klappt es.


----------



## Hansen_07 (11. Nov 2022)

LouCyphre hat gesagt.:


> Keine Ahnung wo der Fehler lag, aber jetzt klappt es.


Und das ist die Hauptsache 👍


----------

