tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
1580
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    Hallo zusammen,

    ich wollte gerade eine Anwendung von mir mit nem anderen Look & Feel darstellen. Mache sowas zum ersten mal (mit einem Look & Feel was ich selbst einbinde)

    Also ich nutze: https://substance.dev.java.net/ (5.0 stable)

    Einbinden wollte ich das L&F mit (Start.java):
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel());
                JFrame.setDefaultLookAndFeelDecorated(true);
            } catch (UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }
            
            new GUI();
        }

    Leider bekomme ich so um die 100 Exceptions... (Auszug)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    org.jvnet.substance.api.UiThreadingViolationException: Component creation must be done on Event Dispatch Thread
        at org.jvnet.substance.utils.SubstanceCoreUtilities.testComponentCreationThreadingViolation(SubstanceCoreUtilities.java:2312)
        at org.jvnet.substance.SubstancePanelUI.createUI(SubstancePanelUI.java:57)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.Trampoline.invoke(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
        at javax.swing.UIDefaults.getUI(Unknown Source)
        at javax.swing.UIManager.getUI(Unknown Source)
        at javax.swing.JPanel.updateUI(Unknown Source)
        at javax.swing.JPanel.<init>(Unknown Source)
        at javax.swing.JPanel.<init>(Unknown Source)
        at javax.swing.JPanel.<init>(Unknown Source)
        at javax.swing.JRootPane.createGlassPane(Unknown Source)
        at javax.swing.JRootPane.<init>(Unknown Source)
        at javax.swing.JFrame.createRootPane(Unknown Source)
        at javax.swing.JFrame.frameInit(Unknown Source)
        at javax.swing.JFrame.<init>(Unknown Source)
        at org.chessoe.gui.GUI.<init>(GUI.java:107)
        at org.chessoe.gui.Start.main(Start.java:34)
    UIDefaults.getUI() failed: createUI() failed for javax.swing.JPanel[,0,0,0x0,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=] java.lang.reflect.InvocationTargetException
    java.lang.Error
        at javax.swing.UIDefaults.getUIError(Unknown Source)
        at javax.swing.MultiUIDefaults.getUIError(Unknown Source)
        at javax.swing.UIDefaults.getUI(Unknown Source)
        at javax.swing.UIManager.getUI(Unknown Source)
        at javax.swing.JPanel.updateUI(Unknown Source)
        at javax.swing.JPanel.<init>(Unknown Source)
        at javax.swing.JPanel.<init>(Unknown Source)
        at javax.swing.JPanel.<init>(Unknown Source)
        at javax.swing.JRootPane.createGlassPane(Unknown Source)
        at javax.swing.JRootPane.<init>(Unknown Source)
        at javax.swing.JFrame.createRootPane(Unknown Source)
        at javax.swing.JFrame.frameInit(Unknown Source)
        at javax.swing.JFrame.<init>(Unknown Source)
        at org.chessoe.gui.GUI.<init>(GUI.java:107)
        at org.chessoe.gui.Start.main(Start.java:34)

    Zeile 107 aus der GUI.java setzt (im Standardkonstruktor) nur mit setTitle() den JFrame-Titel. Eigentlich sehr unspektakulär...

    Jetzt habe ich schon ne ganze Weile Google bemüht und hab folgende Lösung gefunden (Start.java):
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel());
                        JFrame.setDefaultLookAndFeelDecorated(true);
                    } catch (UnsupportedLookAndFeelException e) {
                        e.printStackTrace();
                    }
                    
                    new GUI();
                }
            });

    Das ganze funktioniert schonmal soweit, dass meine Anwendung startet und nicht direkt mit 100 Exceptions stirbt - allerdings finde ich das eine sehr unschöne Lösung. Ich verstehe zwar überhaupt nicht was diese EventQueue ist, noch weiß ich warum das so gemacht werden muss.... Aber ich erkenne wohl das das ein Haufen Pfusch ist
    Und meine Anwendung stürzt immernoch ab, wenn ich aus einem dritten Thread ein JOptionPane öffne. Das kann ich aber unmöglich weg lassen!
    Sonst läuft das ganze stabil

    Nach weiteren Google-Suchen habe ich dann jemanden mit dem selben Problem gefunden. Dazu meinte dann jemand:
    The JTable is created on the thread you created in the constructor of your main class. It is a violation of Swing threading rules.
    (Link: http://markmail.org/message/oioj4pgw...+state:results )

    Raff ich nicht - was genau meint der mit Swing threading rules Nie davon gehört...

    Sollte man seine Oberfläche normalerweise in einem anderen Thread zeichnen als die Logik abläuft? Oder wie darf ich mir das vorstellen?
    So wie ich das verstehe soll die Oberfläche nur in einem seperaten Thread gezeichnet werden.

    Um das Problem zu lösen will ich meine Anwendung nun konform gestalten. Aber ich habe keine Ahnung wie ich da ansetzen soll - daher dieser Thread

    Bitte gebt mir ein paar hilfreiche Links oder Comments.
    Evt hat sich ja zufällig von euch ja auch schon jemand mit Substance auseinander gesetzt.

    lg
    Geändert von Klein0r (28.11.08 um 23:01 Uhr)
     

  2. #2
    macsx macsx ist offline Mitglied Silber
    Registriert seit
    Jan 2008
    Beiträge
    73
    Sers!

    Zum Thema Swing - Thread...
    http://weblogs.java.net/blog/cayhors...ngle_thre.html
     

Ähnliche Themen

  1. Nimbus: Schickes neues Look and Feel für Java Swing
    Von Thomas Darimont im Forum Java Technology News
    Antworten: 14
    Letzter Beitrag: 14.04.11, 19:12
  2. Externes Look & Feel für Swing; Wie importieren/verwenden?
    Von Fastkiller im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 14.04.08, 21:21
  3. [C#] threading - Probleme
    Von marcaurel1984 im Forum .NET Café
    Antworten: 9
    Letzter Beitrag: 19.12.06, 19:41
  4. [swing] eigenes Look and Feel
    Von snowtom im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 14.08.06, 22:13
  5. geändertes Look&Feel für Java Swing
    Von Moosehead im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 24.11.04, 16:24