LookAndFeel Frame updated nicht vollständig

CHAOSFISCH

Bekanntes Mitglied
Servus,

eigentlich hab ich 2 Fragen und füge die 2. einfach hier an:

1. Gibt es irgend eine Möglichkeit halbwegs gut brauchbare LaFs zu bekommen, die kostenfrei sind? Verwende derzeit nur JTattoo

2. Wenn ich das LookAndFeel ändere über, wobei getLaf() den Klassennamen liefet als String, z.B. "com.jtattoo.plaf.xxx.XXXLookAndFeel"
Java:
			UIManager.setLookAndFeel(DesignManager.this.designMap.get(design).getLaF());
Dann muss ich - so sagen es sämtliche Seiten die ich gefunden habe - alle Swing Objekte updaten.
Dies mit SwingUtilties, also folgendes, wobei mainFrame eine Instanz der Klasse MainFrame extends JFrame ist und dies quasi das RootObjekt der SwingObjekte ist.
Java:
			SwingUtilities.updateComponentTreeUI(mainFrame);
Resultat: Das LaF wird aktualisiert - jedoch nicht vollständig. Die Leiste welche minimier, maxmier und schließen buttons enthält - bzw. halt der Rahmen, wird nicht ordnungsgemäß geändert!

Warum? Wie kann ich das beheben?

Gruß
CHAOSFISCH
 

bERt0r

Top Contributor
Weil die ohnehin vom Betriebssystem abhängt. Wenn du da eigene Wege gehen willst, musst du einen JFrame benutzen der undecoreted ist und dir die Buttons selber zusammenbauen.
 

CHAOSFISCH

Bekanntes Mitglied
Weil die ohnehin vom Betriebssystem abhängt. Wenn du da eigene Wege gehen willst, musst du einen JFrame benutzen der undecoreted ist und dir die Buttons selber zusammenbauen.

Es ist ja so: Wenn ich das LookAndFeel beim start - vor der Erstellung des JFrame Objekts angebe, dann funktioniert es ja. Sprich: SwingUtilties updated nicht richtig oder ich muss noch was zusätzlich updaten!
Ich gehe - nach meinem suchen im internet und code - davon aus, dass es AWTWindowAccessor ist, bloß weiß ich nicht wie ich das machen kann.

Gruß
CHAOSFISCH
 

KrokoDiehl

Top Contributor
Meine Erfahrung ist - und so kenne ich es auch von anderen Swing-Anwendungen die das L&F-änderbar haben - dass es nur gescheit geht, wenn die Anwendung neu gestartet wird.

Es hängt stark vom L&F ab ob der Wechsel zur Laufzeit geht, aber meistens gibt es irgendeinen hässlichen Effekt.
Fazit: L&F nur bei Programmstart setzen. Wenn du eine Einstellung in deinen Programm hast, dann dort einfach einen Hinweis á la "wirkt sich erst nach Neustart der Anwendung aus".
 

Ebenius

Top Contributor
Meine Erfahrung ist - und so kenne ich es auch von anderen Swing-Anwendungen die das L&F-änderbar haben - dass es nur gescheit geht, wenn die Anwendung neu gestartet wird.

Es hängt stark vom L&F ab ob der Wechsel zur Laufzeit geht, aber meistens gibt es irgendeinen hässlichen Effekt.
Das deckt sich auch mit meinen Erfahrungen. Nach dem L&F-Wechsel müssen zumindest alle Komponenten (inkl. top-level Container) neu erzeugt werden. Wenn man von Anfang an den Wechsel von L&Fs zur Laufzeit unterstützt, dann könnte man sein Programm so aufbauen, dass man die Komponenten neu erzeugt und die Modelle und Listener behält. Aber das ist keine Empfehlung, nur die Alternative. :)

Ebenius
 

CHAOSFISCH

Bekanntes Mitglied
Das deckt sich auch mit meinen Erfahrungen. Nach dem L&F-Wechsel müssen zumindest alle Komponenten (inkl. top-level Container) neu erzeugt werden. Wenn man von Anfang an den Wechsel von L&Fs zur Laufzeit unterstützt, dann könnte man sein Programm so aufbauen, dass man die Komponenten neu erzeugt und die Modelle und Listener behält. Aber das ist keine Empfehlung, nur die Alternative. :)

Ebenius

Ok, ich muss noch hinzufügen: Das Update updatete nicht alle Komponenten richtig, da das JFrameobjekt nicht im Even dispatch Thread erzeugt wurde - das hab ich halt noch gemacht.
-> Dann werde ichs halt so machen, dass das LaF vollständig ab dem nächsten Neustart ist und unvollständig (also z.B. mit dem Windows Frame) wenn das LaF dynamisch geändert wurde.
 

Ebenius

Top Contributor
Es gibt dabei manchmal noch lustige Artefakte. Ich würde gar nicht umschalten.

Hier ein simples Beispiel wie das Nimbus L&F das Metal kaputt macht:
Initial | After Nimbus
attachment.php
|
attachment.php

Ebenius
 

Anhänge

  • metal initial.png
    metal initial.png
    1,6 KB · Aufrufe: 48
  • metal after nimbus.png
    metal after nimbus.png
    1,7 KB · Aufrufe: 45

CHAOSFISCH

Bekanntes Mitglied
Ja diese Artefakte kenne ich - diese geschehen aber durch nicht im Event Dispatch Thread erstellte JComponents. Macht man dies im richtigen Thread, dann verschwinden bei mir alle Artefakte!
 

Ebenius

Top Contributor
Unüberprüfte Anschuldigungen. Tststs. :) Mit Sicherheit hast Du Unrecht. Probier's aus, ich hab's probiert:

Java:
/* LFFun.java */

/* Copyright 2012 Sebastian Haufe

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;

import javax.swing.*;

/** Test switching L&Fs. */
public class LFFun {

  /** Creates the GUI. Call on EDT, only! */
  @SuppressWarnings("nls")
  static void createAndShowGui() {
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(new JScrollPane(new JTable(2, 2)));
    contentPane.add(new JToggleButton(new AbstractAction("Use Nimbus L&F") {

      private static final long serialVersionUID = 1L;
      private boolean haveNimbus;

      public void actionPerformed(ActionEvent e) {
        try {
          if (haveNimbus) {
            UIManager
                  .setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
          } else {
            UIManager
                  .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
          }
          haveNimbus ^= true;
        } catch (Exception ex) {
          ex.printStackTrace();
        }
        SwingUtilities.updateComponentTreeUI(SwingUtilities
              .getWindowAncestor((Component) e.getSource()));
      }
    }), BorderLayout.LINE_END);

    final JFrame f = new JFrame("Test Frame: LFFun");
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
J "Warte Frame" AWT, Swing, JavaFX & SWT 3
K Swing JDialog aus Frame ausrufen AWT, Swing, JavaFX & SWT 2
M Swing Dynamischer Frame AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben