Changing the look and feel with JRadioButtonMenuItems...

Hi,

how do I change the look and feel of my swing application when selecting a corresponding menu item (JRadioButtonMenuItem)?

The following code shows one of my action methods to display the new look and feel:

privatevoid jRadioButtonMenuItem1ActionPerformed(java.awt.event.ActionEvent evt){

initializeLookAndFeel(metal);

SwingUtilities.updateComponentTreeUI(this);

}

Here is the method to initialize the look and feel:

publicvoid initializeLookAndFeel(String currentLookAndFeel){

try{

UIManager.setLookAndFeel(currentLookAndFeel);

}catch (Throwable t){

try{

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}catch (Exception e){

e.printStackTrace();

}

}

}

But the selected (new) look and feel isn't displayed properly - it seems that the components (I have a JDesktopPane with several JInternalFrame's) are not repainted on the screen because when I, for example, move the mouse over a JButton, it gets repainted according to the selected look and feel...

Or do I have to "repaint" every single component on my JFrame?

Thanks in advance

- Stephan

[1828 byte] By [Jacklera] at [2007-11-27 8:44:31]
# 1

Hmm... that was missing...

When executing the code I get the following exception:

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.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.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.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:4794)

at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4740)

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:480)

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)

- Stephan

Jacklera at 2007-7-12 20:45:20 > top of Java-index,Desktop,Core GUI APIs...
# 2

It seems that my problem has something to do with my JInternalFrames because I did a few tests with just one JFrame and everything worked perfectly.

Can anyone tell me how to dynamically change the look and feel of a swing application which has a JDesktopPane and several JInternalFrames?

Any help would be greatly appreciated

- Stephan

Jacklera at 2007-7-12 20:45:20 > top of Java-index,Desktop,Core GUI APIs...
# 3

Well, I figured out that whenever I remove my JTable from one of the internal frames, it works.

To create the table I have 2 classes which both extend AbstractTableModel: the well known class TableSorter (Version 2.0) and a class called InputBoxTableModel.

So what I do to create the table (which causes the exception when choosing an alternate look and feel) is as follows:

TableSorter sorter = new TableSorter(new InputBoxTableModel());

[...]

jTable1.setModel(sorter);

I also tried just the default constructor for TableSorter and it works - but I'll have to use my table model (InputBoxTableModel) in conjunction with TableSorter (for sorting).

How can I do that without throwing an exception?

- Stephan

Jacklera at 2007-7-12 20:45:20 > top of Java-index,Desktop,Core GUI APIs...