OVH Cloud OVH Cloud

Look 'n Feel

2 réponses
Avatar
Tafanor
Bonjour à tous,

Lorsque je démarre mon appli avec le l&f Metal, et en ayant pris soin
d'exécuter
JDialog.setDefaultLookAndFeelDecorated(true) ;
JFrame.setDefaultLookAndFeelDecorated(true) ;
avant d'afficher ma JFrame, j'obtiens bien une fenêtre décorée. Normal.

Lorsque je veux changer de l&f avec le code :
UIManager.setLookAndFeel(lfClassName) ;
SwingUtilities.updateComponentTreeUI(mainWindow) ;

Et si lfClassName correspond au lf Windows (ou Metal) j'obtiens une
frame au look Windows mais n'ayant PLUS de cadre !!! La barre de titre, les
boutons pour fermer la fenêtre, etc. ont disparu !

Connaissez-vous un remède à ce problème ?
Cordialement,
Tafanor

2 réponses

Avatar
vclassine
"Tafanor" wrote in message news:<3f7182c8$0$10414$...
Bonjour à tous,

Lorsque je démarre mon appli avec le l&f Metal, et en ayant pris soin
d'exécuter
JDialog.setDefaultLookAndFeelDecorated(true) ;
JFrame.setDefaultLookAndFeelDecorated(true) ;
avant d'afficher ma JFrame, j'obtiens bien une fenêtre décorée. Normal.

Lorsque je veux changer de l&f avec le code :
UIManager.setLookAndFeel(lfClassName) ;
SwingUtilities.updateComponentTreeUI(mainWindow) ;

Et si lfClassName correspond au lf Windows (ou Metal) j'obtiens une
frame au look Windows mais n'ayant PLUS de cadre !!! La barre de titre, les
boutons pour fermer la fenêtre, etc. ont disparu !

Connaissez-vous un remède à ce problème ?
Cordialement,


C'est un peu confu, je ne sais pas de quel type est ta "mainWindow" si
c'est une JDialog ça ne me choque pas. Le LNF ne contient pas
seulement des paramètres de couleurs ou aspect des boutons ou combo...
Quand tu changes le LNF tu réapplique tous les paramètres par défaut,
donc si par défaut ta "mainWindow" n'as pas de cadre et de barre de
titre elle dégage, il faut soit changer les paramètres du LNF, soit
refaire:
JDialog.setDefaultLookAndFeelDecorated(true) ;

Avatar
Tafanor
C'est un peu confu, je ne sais pas de quel type est ta "mainWindow" si
c'est une JDialog ça ne me choque pas.


Voici le code incriminé. Vous pouvez exécuter cette classe, qui est pourvue
d'une méthode main. La question est :
"Pourquoi la barre de titre de la JFrame disparaît lorsqu'on change de
L&f ?"

import javax.swing.* ;
import javax.swing.UIManager.LookAndFeelInfo ;
import java.awt.event.* ;

import java.awt.Window ;
import java.awt.Cursor ;

/**
* Creates a JMenu displaying every L&F of the system
* Allows the user to change the current L&F
*/
public class LookAndFeelMenu extends JMenu
{
/**
* Creates the Menu displaying each L&F
* @param title The title to display
*/
public LookAndFeelMenu(String title, char mnemonic)
{
super(title) ;
setMnemonic(mnemonic) ;

// Manages the checkboxes
ButtonGroup bg = new ButtonGroup() ;
// Temporary object
JRadioButtonMenuItem jrbmi ;
// The installed LF
String currentLFName ;
// L&F infos
LookAndFeelInfo[] lfInfos ;

currentLFName = UIManager.getLookAndFeel().getName() ;
lfInfos = UIManager.getInstalledLookAndFeels() ;

for(int i=0, n=lfInfos.length ; i<n ; i++)
{
jrbmi = new JRadioButtonMenuItem(lfInfos[i].getName()) ;
if (currentLFName.equals(lfInfos[i].getName()))
jrbmi.setSelected(true) ;
jrbmi.addActionListener(new LFGest(lfInfos[i].getClassName())) ;
bg.add(jrbmi) ;
// Adds the JRadioButtonMenuItem to the JMenu
add(jrbmi) ;
}
}

/**
* Class managing L&F selections
*/
class LFGest implements ActionListener
{
/** Name of the L&F to set */
protected String lfClassName ;

/**
* Creates an event handler for L&F selections
* @param lfClassName The L&F name to install
*/
public LFGest(String lfClassName)
{
this.lfClassName = lfClassName ;
}

/**
* Install the L&F
*/
public void actionPerformed(ActionEvent e)
{
Window mainWindow SwingUtilities.windowForComponent(LookAndFeelMenu.this) ;
Cursor currentCursor = mainWindow.getCursor() ;

mainWindow.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)) ;

try
{
UIManager.setLookAndFeel(lfClassName) ;

JFrame.setDefaultLookAndFeelDecorated(true) ;
JDialog.setDefaultLookAndFeelDecorated(true) ;

SwingUtilities.updateComponentTreeUI(mainWindow) ;
}
catch(Exception ex)
{
System.err.println("Unable to load "+lfClassName+" L&F") ;
ex.printStackTrace() ;
}
finally
{
// Restores the cursor
mainWindow.setCursor(currentCursor) ;
}
}
}

/**
* Why the title bar of the JFrame disappears ?
**/
public static void main(String[] args)
{
try
{
JFrame.setDefaultLookAndFeelDecorated(true) ;
JDialog.setDefaultLookAndFeelDecorated(true) ;
}
catch(Exception ex) {}

JFrame jf = new JFrame("Test") ;
JMenuBar jmb = new JMenuBar() ;
jmb.add(new LookAndFeelMenu("Look 'n Feel", 'L')) ;
jf.setJMenuBar(jmb) ;
jf.getContentPane().add(new JButton("Click")) ;

jf.pack() ;
jf.setVisible(true) ;
}
}