# setUndecorated lässt GUI "spacken"



## JJK3 (20. Dez 2012)

Hallo,

Ich habe ein Programm geschrieben was im Vollbild-Modus laufen soll!!
Es wird gestartet und dann Direkt auf fenster.setUndecorated(true); gesetzt!!

```
class Abc {
      JFrame fenster = new JFrame("hdfg");

     public void main(String[] args) {
          Abc abc = new Abc();
          abc.los();
     }
     
     public void los() {
           fenster.setUndecorated(true);
           //dann werden noch ein paar Panels geadded, denen schon JButtons und JTextFields geadded wurden...
     }
}
```

Die GUI ist dann ca. 5 sekunden schön zu sehen,
dann bricht alles zusammen... ;(
Die GUI fängt an zu blinken und erscheint an anderen Stellen usw.
Dann kommt ne Fehler-Meldung die jedoch nicht von meinem Code ausgelösst wurde!!


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.plaf.basic.BasicScrollPaneUI.paint(BasicScrollPaneUI.java:103)
	at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
	at javax.swing.JComponent.paintComponent(JComponent.java:778)
	at javax.swing.JComponent.paint(JComponent.java:1054)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
	at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
	at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
	at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
	at java.awt.EventQueue.access$000(EventQueue.java:102)
	at java.awt.EventQueue$3.run(EventQueue.java:662)
	at java.awt.EventQueue$3.run(EventQueue.java:660)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
```

*Jemand ne Idee??*


----------



## xehpuk (20. Dez 2012)

Führ den Code im EDT aus.

The Event Dispatch Thread (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)


----------



## JJK3 (20. Dez 2012)

warum?
was bringt mir das?


----------



## tröööt (20. Dez 2012)

Swing ist NICHT thread-safe ... ergo : ALLE ops die die gui verändern MÜSSEN im EDT ausgeführt werden ...


----------



## JJK3 (20. Dez 2012)

Soll ich also meinen ganzen swing bildenden Code in einen Thread machen und am ende in meine los Methode das hier schreiben?

SwingUtilities.invokeLater(GUI_Creator);


----------



## xehpuk (20. Dez 2012)

JJK3 hat gesagt.:


> warum?
> was bringt mir das?


Meinen Link hättest du ruhig anklicken (und lesen) können. :rtfm:
Den Konstruktor von 
	
	
	
	





```
Abc
```
 musst du auch im EDT ausführen, weil dort der 
	
	
	
	





```
JFrame
```
 erstellt wird.


----------



## JJK3 (20. Dez 2012)

NUR den Kram wenns mit dem JFrame selber was zu tun hat oder auch das mit den Panels?


----------



## xehpuk (20. Dez 2012)

Alles. Das verlinkte Java-Tutorial steht dir weiterhin zur Verfügung.


----------



## JJK3 (20. Dez 2012)

Die Listener auch?


----------



## JJK3 (20. Dez 2012)

Egal geht trotzdem (mit oder ohne Listener) nicht!!

Alles wie vorher GUI spackt, etc.


----------



## xehpuk (20. Dez 2012)

Poste ein KSKB.


----------



## JJK3 (20. Dez 2012)

Du hast's auch mit Abkürzungen, oder? :lol:

Naja:


```
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.*;

public class Abc {
    JFrame fenster;
    Dimension screenSize = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
    JPanel p;
    JLabel l;
    
    public static void main (String[] args) {
       Abc abc = new Abc();
       abc.los();
    }
    
    public void los() {
          SwingUtilities.invokeLater(new GUI_Creator());
    }
    
    
   class GUI_Creator implements Runnable {
       public void run() {
                fenster = new JFrame("frame");
                p = new JPanel();
                l = new JLabel("hfauzhsgafzjg");
                fenster.setUndecorated(true);
                
                p.add(l);
                fenster.add(BorderLayout.SOUTH,p);
                fenster.setSize((int)screenSize.getWidth(), (int)screenSize.getHeight());
                fenster.getContentPane().setBackground(Color.WHITE);
                fenster.setLocationRelativeTo(null);
                fenster.setVisible(true);
                fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       }
   }
}
```
so das geht ohne probleme, mein Programm aber nicht!!!
Verstehe nicht warum, gut es sind mehr Panel, mehr Buttons, mehr Listener, aber trotzdem...
Ich blicks nicht!!!!!!!!!!!!!!!!!!!!!!!


----------



## tröööt (20. Dez 2012)

aus deinem stack geht hervor das du vermutlich mit nem JScrollPane oder der gleichen arbeitest ... weis zwar nicht wo hier was den unterschied machen soll ... aber vielleicht hat JFrame.setUndecorated(true) noch ein paar mehr nebenwirkungen die hier irgendwie untergehen ... kann auch mit dem verwendeten layoutmanager zu tun haben ...


----------



## JJK3 (21. Dez 2012)

Das mit dem JScrollPane Stimmt!!
Aber mal ehrlich daran kann es ja wohl nicht liegen oder?
Das mit dem Layout überprüfe ich schnell...
Benutze nur zwei:
BoxLayout und BorderLayout!!
In meinem Beispiel benutze ich ja nur das BorderLayout(Wie gesagt problemlos!!

EDIT:
So kurz dem JPanel p ein BoxLayout und egal ob ich Y_AXIS oder X_AXIS mache, funktioniert beides!!


----------



## JJK3 (21. Dez 2012)

Hab ne neue Spur 

Die GUI fängt ab dem Moment an zu "spacken", wenn Action- oder ItemListener ins Spiel kommen!!

Weiß jemand wie ich das beheben kann?


----------



## benhaze (21. Dez 2012)

Es scheint so als würde Code in einer *ungünstigen* Reihenfolge aufgerufen.
Beispiel: Es wird versucht die Fenstergröße zu ermitteln, dabei ist das Fenster noch nicht sichtbar.

Prüfe mal deine Listener.
Stelle sicher das deine Listener erst dann *aktiv* werden, nachdem die GUI *fertig* initialisiert ist.


----------



## JJK3 (22. Dez 2012)

Was meinst du mit aktiviert?
Ich "adde" die Action Listener erst am Ende des Initialisierungs-Codes wenn du das meinst!
Aufgerufen werden die Listener ja erst bei Klicken!!
Wenn man die Button oder Checkboxes anklickt, erscheint übrigens ein Abbild der Checkbox oder des Buttons, in der oberen Linken Ecke!!
Ich glaub ich steh auf'm Schlauch!


----------



## JJK3 (22. Dez 2012)

Ich verstehe vorallem nicht warum das nur passiert wenn ich das JFrame "undecoriere"!!!!!!
*Jemand ne Idee*


----------



## trääät (22. Dez 2012)

meine idee hab ich schon gebracht ... nämlich das intern irgendwas mit irgendwelchen components und layouts nicht hinhaut die auf grund von undecorated z.b. falsche werte bekommen ...

ich mein ... irgendeinen unterschied muss es ja schon machen ... also könnte man auch versuchen andersrum zu gehen : was ändert sich alles wenn man das frame auf undecorated setzt ... und welche weiteren werte werden dann davon beeinflusst ... und wo ruft wann wer welchen wert wo wie ab ?
klar dürfte das ne lustige angelegenheit werden ... aber "vorwärts" rum gehts ja scheinbar nicht ...

man könnte ja auch mal so lange vom aktuellen projekt components entfernen bis es nicht mehr spackt und so vielleicht herrausbekommen an welcher component es liegen könnte ... und dann versuchen zu ermitteln was diese alles für werte braucht ...

versuch mal dein code soweit auf ein kskb zu reduzieren das der fehler noch auftritt .. aber alles unnötige raus ist ... vielleicht kann man erahnen was es sein könnte


----------



## JJK3 (22. Dez 2012)

Ich hab meinen code ja schon soweit auf den KSKB heruntergekürzt!!
Wenn ich die Listener Hinzufüge fängt das laggen an!!
*IRGENDWER EINE IDEE??*


----------



## benhaze (22. Dez 2012)

Macht dein Frame-Konstruktor irgendwas besonderes?
Ich meine es deswegen, weil du z.B setUndecorated(true) außerhalb des ctors aufrufst.
Auch setDefaultCloseOperation sollte im ctor stehen oder zumindest vor setVisible()

Dein Code-Beispiel funktioniert zwar evtl., entspricht aber offensichtlich nicht 100% dem original.
Ich denke genau in dem Unterschied könnte das Problem liegen.

Stacktrace untersuchen wäre auch nicht schlecht.
Hast du dir schon mal den Code in Zeile 103 in der Klasse BasicScrollPaneUI.java angeschaut?
Das könnte auch Rückschlüsse geben.

*Edit:*
Hab mir mal BasicScrollPaneUI angeschaut.
Es scheint so als würde die Paint-Methode aufgerufen, bevor installUI aufgerufen wird.
Schon mal nen *Brechpunkt* (in BasicScrollPaneUI.java:103) gesetzt und den Stacktrace kontrolliert?
Dann kannste ja sehen wo *er* herkommt und ob installUi() zuvor aufgerufen wurde.

*Edit 2:*
Wenn ich mir nochmal deine Posts anschaue, riecht es für mich streng nach Threading-Probleme.
Also z.B das zu außerhalb des EDT Swing-Components änderst...
Arbeitest du evtl. mit mehreren Threads?

Alles nur Ideen...
Ohne *vollständigen* Code kann ich leider nur spekulieren...

*Edit 3:*
Du sagst: **Aufgerufen werden die Listener ja erst bei Klicken!!**
Das stimmt aber nicht unbedingt bei deinen Item-Listenern!
Diese Listener können teilweise schon beim Ändern des Models (JTable, JList, JComboBox) greifen!


----------



## JJK3 (23. Dez 2012)

Da mit dem Aufrufen der Listener mag stimmen, aber in der oberen linken ecke fangen sie erst an zu blinken wenn ich sie (bei den Buttons) überstreiche oder (bei den Checkboxes) anklicke!!
Vorher hat übrigens auch noch ein Panel gelaggt in dem nur Labels waren! Sehr seltsam!
Dieses Problem hab ich dann durch stümperhaftes "dauerschleifiges" Aufrufen des JFrame repaints behoben!!
Naja danke für deine Hilfe!
Ich poste morgen mal den bereits laggenden KSKB!!


----------



## JJK3 (26. Dez 2012)

```
import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.*;

public class Abc {
    JFrame fenster;
    Dimension screenSize = new Dimension(Toolkit.getDefaultToolkit().getScreenSize());
    JPanel p;
    JLabel l;
    JLabel l2;
    JButton JA;
    JButton NEIN;
    
    public static void main (String[] args) {
       Abc abc = new Abc();
       abc.los();
    }
    
    public void los() {
          SwingUtilities.invokeLater(new GUI_Creator());
    }
    
    
   class GUI_Creator implements Runnable {
       public void run() {
                fenster = new JFrame("frame");
                p = new JPanel();
                l = new JLabel("hfauzhsgafzjg");
                l2 = new JLabel("hfauzhsgafzjg-----2");
                JA = new JButton("JA");
                NEIN = new JButton("NEIN");
                fenster.setUndecorated(true);
                
                p.setLayout(new BoxLayout(p,BoxLayout.Y_AXIS));
                p.add(l);
                p.add(l2);
                p.add(JA);
                p.add(NEIN);
                fenster.add(BorderLayout.SOUTH,p);
                fenster.setSize((int)screenSize.getWidth(), (int)screenSize.getHeight());
                fenster.getContentPane().setBackground(Color.WHITE);
                fenster.setLocationRelativeTo(null);
                fenster.setVisible(true);
                fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                NEIN.addActionListener(new NEIN());
                JA.addActionListener(new JA());
       }
   }
   
   
    class JA implements ActionListener {
        public void actionPerformed(ActionEvent e) {
                fenster.dispose();
        }
    }
    class NEIN implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            fenster.dispose();
        }
    }
}
```

*Das wäre der Code!! Jemand ne Idee?*


----------



## Gast2 (26. Dez 2012)

Was passt bei dem Code nicht?
Der lässt sich bei mir problemlos ausführen.


----------



## JJK3 (26. Dez 2012)

Ja, ist ja auch ein KSKB(Abkürzungen über alles :lol

Aber funktioniert das wirklich problemlos? Auch wenn du über die Buttons streichst?
Erscheint bei dir nicht in der oberen Linken Ecke ein Abblid des Buttons?
Bei mir nämlich schon, was ziemlich nervig ist, vorallem wenn man mehr Button's und Listener-Behaftete Dinge hat!!


----------



## JJK3 (27. Dez 2012)

*Nimand irgendeine Schlaue Idee?? *


----------



## benhaze (27. Dez 2012)

Habe deinen *sscce* mal getestet.
Funktioniert problemlos. Keine seltsamen Erscheinungen beim *Überstreichen* der Buttons.
getestet mit jdk1.6.0_30

Hast du Probleme mit genau diesem Code?

OT:
*sscce (short, self contained, correct example)*ist in meinen Augen die gängigere Abkürzung.
Zumindest wenn man nicht ausschließlich in deutschsprachigen Foren unterwegs ist.
http://sscce.org


----------



## JJK3 (27. Dez 2012)

Unglaublich,
den ja ich habe probleme mit genau diesem Code!!
Wie gesagt wenn man die BUttons überstreicht erscheint ein Abblid von ihnen in der linken, oberen Ecke!!
Wie hast du es den Kompiliert(ich mit BlueJ)?
Danke für deine Mühe!


----------



## benhaze (27. Dez 2012)

Mit NetBeans 7 und (Oracle) JDK 1.6.30 (*naja..eigentlich Ant und javac aus dem JDK*)
Hast du mal deine Java-Version geprüft?
Ich halte es zwar für nicht sehr wahrscheinlich das sich dort der *Bug* verbirgt, aber unmöglich ist es nicht.


----------



## JJK3 (27. Dez 2012)

Laut System_Einstellungen-> Programme->Java->Allgemein->Versions_Informationen
Java7 Update 5!!


----------



## JJK3 (27. Dez 2012)

Hab jetzt manuell ein Update heruntergeladen!!
Komisch das mir das nicht angezeigt wurde :noe:
jetzt funktioniert es, das sscce()
Ich teste das nochmal ausfürhlich!

[EDIT]Doch nicht, der selbe Bug[/EDIT]


----------



## benhaze (27. Dez 2012)

Ich kenne jetzt BlueJ nicht richtig und auch deine Erfahrungen damit nicht.
In NetBeans kann man z.B *Projektweise* die Java-Version konfigurieren.
Nicht *Systemweit*, wie du schreibst.
Möglicherweise ist das auch die Java-Version, mit der BlueJ gestartet wurde?!

JDKs werden *normalerweise* nicht automatisch aktualisiert. (das wäre auch blöd)
Wenn du eine neues JDK herunterlädst, musst du es auch in BlueJ konfigurieren.

Dein Code funktioniert auch problemlos mit Java 1.7.0_07


----------



## JJK3 (27. Dez 2012)

Bin dabei mir Netbeans runterzuladen, javaEE ist richtig?


----------



## benhaze (27. Dez 2012)

Java EE nein.
JAVA SE reicht dafür.

siehe (http://www.java-forum.org/java-basics-anfaenger-themen/131484-exakte-unterschied-zwischen-java-ee-java-se.html)

Was hast du denn für eine Windows Version?
Ich habe das jetzt mit Windows 7 getestet.
Ich habe z.B keine Ahnung ob es evtl. irgendwelche Nebeneffekte mit deiner Java-Version + setUndecorated + Windows 8 gibt.


----------



## JJK3 (27. Dez 2012)

jetzt hab ich javaEE installiert ist schlimm oder hat das einfach nur mehr funktionen(so hab ichs verstanden)?


----------



## benhaze (27. Dez 2012)

Ich weiss nicht ob Java EE das JDK beinhaltet?!
Besser ist, wenn du Java SE JDK lädst:
Java SE Downloads

Edit:
Offensichtlich gibt es JavaEE mit und ohne JDK! (wahlweise)
Du brauchst aber nur das JDK.


----------



## JJK3 (27. Dez 2012)

Es enthät einen Java Editor, allerdings bin ich zu blöd mein sscce zu compilieren geschweige den zu starten!! ;(
Wenn ich auf den run Button klicke, kommt erst ein Fehler das mehrere Fehler aufgetreten sind, dann eine Fehlermeldung:

```
run:
Fehler: Hauptklasse javaapplication1.JavaApplication1 konnte nicht gefunden oder geladen werden
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)
```

Was mache ich falsch?


----------



## benhaze (27. Dez 2012)

Du hast wahrscheinlich ein neues Projekt angelegt (Java-Application).
In den Projekteinstellungen musst du die Klasse mit der Main-Methode auswählen.
Bei dir ist ausgewählt: javaapplication1.JavaApplication1

Rechte Maustaste auf das Projekt -> Properties -> RUN -> Main-Class


----------



## benhaze (27. Dez 2012)

In der Toolbar gibt es auch einen Button, der die Main-Methode der aktuellen Klasse im Editor *startet*.
Du musst dir mal die Toolbar angucken und konfigurieren (suche nach: *Run File* / *Debug File*)
Dann musst du nicht immer die Projekteinstellungen ändern.


----------



## JJK3 (27. Dez 2012)

Klicke ich unter run auf run File kommt

```
run:
java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Uncompilable source code - class Abc is public, should be declared in a file named Abc.java
	at Abc.<clinit>(JavaApplication1.java:8)
Exception in thread "main" Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)
```


----------



## benhaze (27. Dez 2012)

Ja, wie die Fehlermeldung schon sagt.
Deine Klasse Abc sollte in einer Datei sein, die auch Abc.java heißt.
Der Name der Datei, in der deine Klasse ist, lautet aber: JavaApplication1.java

Rechts klick auf die Klasse im Projekt-Explorer -> Refactor -> Rename.

Oder nenne deine Klasse: JavaApplication1 (anstatt Abc)

Edit:
Du hast deinen Code einfach ein den Editor kopiert.
So einfach geht das aber nicht.
- Der Classname muss schon mit dem Dateinamen übereinstimmen
- der Packagename muss korrekt sein


----------



## benhaze (27. Dez 2012)

Oder im Projektexplorer auf -> new Java Class -> Abc.
Dann dort deinen Code einfügen. (aber nicht das Package überschreiben!)
Fehlende Imports kannst du mit *Fix Imports* (Kontextmenü im SourceCode mal anschauen) korrigieren.


----------



## JJK3 (27. Dez 2012)

Habs lag irgendwie daran das die Klasse public war!!
Kein Ahnung warum...
Egal jedenfalls das gleiche Problem wie vorher!!


----------



## benhaze (27. Dez 2012)

Ja, wenn die Klasse Abc public ist, muss die Datei genau so heißen.
Aber auch sonst sollte der Dateiname der gleiche sein wie der Klassenname (+ .java)

Welches Problem meinst du?
Das mit den Button oder das mit NetBeans?


----------



## JJK3 (27. Dez 2012)

Das mit den Buttons ^^!!
Ich bin völlig ratlos...
Wieso funktioniert es bei dir, aber nicht bei dir?


----------



## benhaze (27. Dez 2012)

Dann könnte es auch etwas zu tun haben mit:
- Java-Version
- Windows-Version
- Grafikkarten-Treiber


----------



## JJK3 (28. Dez 2012)

Treiber = nein(Update gemacht selbes Problem | AMD HD 6850)
Windows-Version = ??(habe Windows 7 Home-Edition 64bit wie siehts bei dir aus?)
Java-Version = 1.7.0_05 Runtime-Envirement


----------



## benhaze (28. Dez 2012)

Bei mir im Einsatz:
- Windows 7 64 bit
- Java 1.6.30 (32 Bit) + Java 1.7.7 (64 bit)

Dein Example-Code funktioniert ohne Probleme.

Hast du so ein Verhalten schon bei anderen Java-Programmen beobachten können?
Passiert das wirklich nur bei *setUndecorated*()?

Edit:
Hier scheint jemand ein ähnliches Problem gehabt zu haben:
https://forums.oracle.com/forums/thread.jspa?messageID=5446709
Das Problem lag hier u.a scheinbar tatsächlich an der Java-Version.


----------



## benhaze (28. Dez 2012)

Du kannst auch mal ein paar Java-Properties benutzen/testen:

z.B

sun.java2d.d3d=false 
sun.java2d.noddraw=true

rufe einfach mal folgendes in deiner Main()-Methode auf (*als erstes!*, bevor du irgendwas mit der GUI machst)


```
String propertyName = "sun.java2d.noddraw";
System.setProperty(propertyName, "true");
        
propertyName = "sun.java2d.d3d";
System.setProperty(propertyName, "false");
```


----------



## JJK3 (28. Dez 2012)

:applaus: :toll: :lol:   
*läuft!!!!!!!!!!!!!!!!!!!!!!!*

Wie funktioniert das??
Was macht dieser Code?


----------



## benhaze (28. Dez 2012)

*sun.java2d.noddraw=true:*
Setting this flag to true turns off DirectDraw usage, which sometimes helps to get rid of rendering problems on Win32.

Kann man hier nachlesen:
System Properties for Java 2D(TM) Technology


----------



## JJK3 (28. Dez 2012)

Ich dachte immer ich hab ein Win64 System aber egal!
funktioniert ja!


----------



## benhaze (28. Dez 2012)

Abgesehen von dem evtl. veralteten Win32 Kommentar/Ausdruck, kommt es noch immer darauf an,
welche JAVA-Version du benutzt, um deine Anwendung auszuführen!

Es kommt hier dann nicht auf dein Betriebssystem an!
Wenn du Java-32 bit benutzt (z.B in ProgramFiles(X86)), dann bist du auch im quasi 32-bit context.
(dann kannst zu z.B keine 64 bit native libs/dlls laden (mit System.loadLibrary))


----------

