setUndecorated lässt GUI "spacken"

JJK3

Aktives Mitglied
Hallo,

Ich habe ein Programm geschrieben was im Vollbild-Modus laufen soll!!
Es wird gestartet und dann Direkt auf fenster.setUndecorated(true); gesetzt!!
Java:
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!!

Code:
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??
 
T

tröööt

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

JJK3

Aktives Mitglied
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);
 

JJK3

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

Naja:

Java:
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!!!!!!!!!!!!!!!!!!!!!!!
 
T

tröööt

Gast
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

Aktives Mitglied
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

Aktives Mitglied
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

Mitglied
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

Aktives Mitglied
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!
 
Zuletzt bearbeitet:
T

trääät

Gast
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

Aktives Mitglied
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??
 
Zuletzt bearbeitet:

benhaze

Mitglied
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!
 
Zuletzt bearbeitet:

JJK3

Aktives Mitglied
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!!
 
Zuletzt bearbeitet:

JJK3

Aktives Mitglied
Java:
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?
 

JJK3

Aktives Mitglied
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!!
 
Zuletzt bearbeitet:

benhaze

Mitglied
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
 
Zuletzt bearbeitet:

JJK3

Aktives Mitglied
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

Mitglied
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.
 
Zuletzt bearbeitet:

JJK3

Aktives Mitglied
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

Mitglied
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
 

benhaze

Mitglied
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.
 
Zuletzt bearbeitet:

JJK3

Aktives Mitglied
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:
Code:
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

Mitglied
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

Mitglied
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

Aktives Mitglied
Klicke ich unter run auf run File kommt
Code:
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

Mitglied
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
 
Zuletzt bearbeitet:

benhaze

Mitglied
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

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

benhaze

Mitglied
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

Aktives Mitglied
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

Mitglied
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.
 
Zuletzt bearbeitet:

benhaze

Mitglied
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)

Java:
String propertyName = "sun.java2d.noddraw";
System.setProperty(propertyName, "true");
        
propertyName = "sun.java2d.d3d";
System.setProperty(propertyName, "false");
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
M String lässt sich nicht Zusammenfügen Allgemeine Java-Themen 10
T Login lässt App crashen! Allgemeine Java-Themen 14
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
E GUI.jfm lässt sich nicht mehr öffnen Allgemeine Java-Themen 1
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
L Jar lässt sich nicht öffnen Allgemeine Java-Themen 12
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
K Java lässt sich nicht Installieren Windows7Ultimate 64Bit Allgemeine Java-Themen 1
L Garbage Collector lässt Programm kurz hängen Allgemeine Java-Themen 10
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
F Spiel lässt sich nicht aus GUI starten Allgemeine Java-Themen 5
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
N Java lässt sich nicht löschen! Allgemeine Java-Themen 7
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
P jar-Datei lässt sich nicht ausführen Allgemeine Java-Themen 5
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
D JMF - lässt sich nicht im ausgewählten Format aufnehmen Allgemeine Java-Themen 2
M Java lässt sich nicht installieren Allgemeine Java-Themen 10
J pack() lässt JFrame grau Allgemeine Java-Themen 3
V JRE lässt sich nicht installieren. Allgemeine Java-Themen 10
L JDK lässt sich nicht deinstallieren Allgemeine Java-Themen 3
T KeyListener lässt sich nur einmal drücken Allgemeine Java-Themen 2
T Datenbank lässt sich un Entwicklungsumgebung öffnen, aus .jar aber nicht Allgemeine Java-Themen 9
D Shell-Prozess lässt Thread nicht enden Allgemeine Java-Themen 4
S HWPF Problem: doc lässt sich nach Bearbeitung nicht mehr lesen Allgemeine Java-Themen 6
T (nur) HP Photosmart Drucker lässt einzelne Seiten aus Allgemeine Java-Themen 6
G Thread lässt sich mit interrupt() nicht unterbrechen Allgemeine Java-Themen 6
S Lässt sich eigne JPanel Klasse in ein Array "stecken&qu Allgemeine Java-Themen 5
Noar Klasse lässt sich nicht kompilieren Allgemeine Java-Themen 2
J jacob - lässt sich nicht installieren Allgemeine Java-Themen 8
J Simpler Thread lässt sich NIE über interrupt() unterbrechen Allgemeine Java-Themen 8
H Java lässt sich nicht öffnen. Allgemeine Java-Themen 16
S Javaprogramm lässt sich nicht per .bat Datei ausführen. Allgemeine Java-Themen 22
E Programm lässt sich nicht starten ! Allgemeine Java-Themen 16
S habe programm aber es lässt sich net mit bild einbinden! Allgemeine Java-Themen 4
M Access lässt sich nicht über "exec(command)" start Allgemeine Java-Themen 3
H DataOutputStream Ob lässt sich nicht vergleichen mit Strings Allgemeine Java-Themen 5
B jar-Datei lässt sich nicht ausführen Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben