Avatar billede mhj28 Nybegynder
28. oktober 2004 - 14:11 Der er 6 kommentarer

skifte LookAndFeel dynamisk

som noget af det første i min application bruger jeg denne ligne

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

Det virker findt, men hvis jeg så prøver at skifte LookAndFeel mens programmet køre går det galt, jeg får en NullPointerException.

Jeg skifter det på denne måde:

UIManager.setLookAndFeel(newLookAndFeel);

// update LAF for the toplevel frame, too
final Frame f[] = JFrame.getFrames();

for (int i=0; i < f.length; i++) {
  Frame frame = f[i];
  SwingUtilities.invokeLater(new MyFrameRunnable(this, frame){
      public void run() {  SwingUtilities.updateComponentTreeUI(((Frame)obj));
      }});
}


class MyFrameRunnable implements Runnable {
  protected MyFrame myFrame;
  protected Object obj;
       
  public MyFrameRunnable (MyFrame myFrame, Object obj) {
      this.mailClient = mailClient;
      this.obj = obj;
  }
   
  public void run() {}
}

og får denne NullPointerException: hvad gør jeg forkert???

java.lang.NullPointerException
    at com.sun.java.swing.plaf.windows.WindowsTableHeaderUI$XPDefaultRenderer.paint(WindowsTableHeaderUI.java:81)
    at javax.swing.CellRendererPane.paintComponent(CellRendererPane.java:134)
    at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(BasicTableHeaderUI.java:401)
    at javax.swing.plaf.basic.BasicTableHeaderUI.paint(BasicTableHeaderUI.java:341)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
    at javax.swing.JComponent.paintComponent(JComponent.java:541)
    at javax.swing.JComponent.paint(JComponent.java:808)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JViewport.paint(JViewport.java:722)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JSplitPane.paintChildren(JSplitPane.java:1021)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JSplitPane.paintChildren(JSplitPane.java:1021)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JComponent.paint(JComponent.java:817)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:557)
    at javax.swing.JComponent.paintChildren(JComponent.java:647)
    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4802)
    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4748)
    at javax.swing.JComponent.paint(JComponent.java:798)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
    at java.awt.Container.paint(Container.java:1312)
    at javax.swing.JFrame.update(JFrame.java:392)
    at sun.awt.RepaintArea.paint(RepaintArea.java:169)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:260)
    at java.awt.Component.dispatchEventImpl(Component.java:3678)
    at java.awt.Container.dispatchEventImpl(Container.java:1627)
    at java.awt.Window.dispatchEventImpl(Window.java:1606)
    at java.awt.Component.dispatchEvent(Component.java:3477)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Avatar billede arne_v Ekspert
28. oktober 2004 - 14:16 #1
Kan du ikke nøjes med:

SwingUtilities.updateComponentTreeUI(this);

?
Avatar billede arne_v Ekspert
28. oktober 2004 - 14:16 #2
Eksempel:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class MultiLookAndFeel extends JFrame implements ActionListener {
  private JButton windows = new JButton("Windows");
  private JButton motif = new JButton("Motif");
  private JButton metal1 = new JButton("Metal/ocean");
  private JButton metal2 = new JButton("Metal/steel");
  private JButton gtk = new JButton("GTK");
  private JButton java = new JButton("Java");
  private JButton system = new JButton("System");
  public MultiLookAndFeel() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      getContentPane().setLayout(new GridLayout(7, 1));
      windows.addActionListener(this);
      getContentPane().add(windows);
      motif.addActionListener(this);
      getContentPane().add(motif);
      metal1.addActionListener(this);
      getContentPane().add(metal1);
      metal2.addActionListener(this);
      getContentPane().add(metal2);
      gtk.addActionListener(this);
      getContentPane().add(gtk);
      java.addActionListener(this);
      getContentPane().add(java);
      system.addActionListener(this);
      getContentPane().add(system);
      pack();
  }
  public void actionPerformed(ActionEvent e) {
      try {
        if(e.getSource() == windows) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } else if(e.getSource() == motif) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
        } else if(e.getSource() == metal1) {
            javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(new javax.swing.plaf.metal.OceanTheme());
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } else if(e.getSource() == metal2) {
            javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(new javax.swing.plaf.metal.DefaultMetalTheme());
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } else if(e.getSource() == gtk) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
        } else if(e.getSource() == java) {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } else if(e.getSource() == system) {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
      } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
      } catch (InstantiationException e1) {
        e1.printStackTrace();
      } catch (IllegalAccessException e1) {
        e1.printStackTrace();
      } catch (UnsupportedLookAndFeelException e1) {
        e1.printStackTrace();
      }
      SwingUtilities.updateComponentTreeUI(this);
      pack();
  }
  public static void main(String[] args) {
      MultiLookAndFeel f = new MultiLookAndFeel();
      f.setVisible(true);
  }
}
Avatar billede mhj28 Nybegynder
28. oktober 2004 - 14:34 #3
Jo jeg kan godt få det til at virke hvis jeg ikke har sat UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); i starten af min main classe, men kun skifter det inden for den samme JFrame.

Men hvis jeg har sat det i starten af min main classe, får jeg NullPointerException når jeg prøver at skifte det i min JFrame!!!
Avatar billede arne_v Ekspert
28. oktober 2004 - 20:07 #4
Hvor sker den exception ?  (udfra stack trace)
Avatar billede mhj28 Nybegynder
29. oktober 2004 - 14:20 #5
Ja det er en e.printStackTrace() i min MyFrame der får fejlen denne classe er ret så stor jeg har også andre frames og dialogs til denne application, men det er den i MyFrame der fejler
Avatar billede zaim Nybegynder
31. oktober 2004 - 11:04 #6
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester