PDA

View Full Version : [Java] componente AWT dentro interfaccia Swing


fero86
23-10-2009, 00:15
salve a tutti.

i problemi di interoperabilitá tra AWT e Swing sono ben noti e non li sto neanche a riassumere, peró io vorrei (se é fattibile in maniera agevole) inserire un componente AWT dentro un'interfaccia grafica basata su Swing; il mio JFrame ha un BorderLayout e contiene la JMenuBar, una JToolbar installata in BorderLayout.NORTH e (semplificando un po') questo componente AWT installato in BorderLayout.CENTER.

ora chiaramente (chiaramente per chi conosce il problema) quando apro i menu, che sono dei JMenu, questi vengono nascosti dal componente AWT e ne resta visibile solo la parte che sta non sopra il componente AWT ma sopra la JToolbar; peró ho scoperto che se stacco la JToolbar e la lascio floating Swing si rende conto che c'é un'altra finestra nativa (per forza perché la JToolbar floating deve poter uscire dal JFrame) e quindi per riuscire ad essere autocoerente si trova costretto a mostrare i JMenu in finestre native separate, e quindi in quel caso i JMenu stanno sopra al componente AWT e si vedono bene. in tutto ció il componente AWT é un Canvas.

ora mi chiedevo: per fare un workaround é possibile in qualche modo dire a Swing di aprire i JMenu sempre in finestre native separate, non solo quando la JToolbar é floating?

anticipatamente grazie!

banryu79
23-10-2009, 11:29
ora mi chiedevo: per fare un workaround é possibile in qualche modo dire a Swing di aprire i JMenu sempre in finestre native separate, non solo quando la JToolbar é floating?


Sě, JMenu ha un metodo che si chiama getPopupMenu() che restituisce il JPopupMenu associato al JMenu stesso: JPopupMenu ha una property, lightWeightPopupEnabled, che di default č impostata a true e indica al L&F di utilizzare un popup lightweigth.
Se la imposti a false forzi l'utilizzo del popoup heavyweight.

Commentando la riga in grassetto mi ritrovo nella tua situazione:

public class PopupAWTMenu extends JFrame
{
public static void main(String[] args)
{
PopupAWTMenu frame = new PopupAWTMenu("Menu over AWT component");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(500,400);
frame.setVisible(true);
}

public PopupAWTMenu(String title) {
super(title);
initialize();
}

private void initialize() {
JMenuBar menu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem fileItem1 = new JMenuItem("Item1");
JMenuItem fileItem2 = new JMenuItem("Item2");
fileMenu.add(fileItem1);
fileMenu.add(fileItem2);
fileMenu.getPopupMenu().setLightWeightPopupEnabled(false);
menu.add(fileMenu);
setJMenuBar(menu);
//
JToolBar toolbar = new JToolBar();
toolbar.add(new AbstractAction("Foo"){public void actionPerformed(ActionEvent e){}});
toolbar.add(new AbstractAction("Boo"){public void actionPerformed(ActionEvent e){}});
toolbar.add(new AbstractAction("Poo"){public void actionPerformed(ActionEvent e){}});
add(toolbar, BorderLayout.NORTH);
//
Panel awtPanel = new Panel();
add(awtPanel, BorderLayout.CENTER);
}
}



@EDIT:
Mi č venuto in mente che esiste anche una property defaultLightWeightPopupEnabled [true/false] che dice al L&F quale č il valore di default per determinare se usare popup lightweight o heavyweight.

Ti basta settare questa a false prima di costruire i tuoi menu.

public class PopupAWTMenu extends JFrame
{
public static void main(String[] args)
{
JPopupMenu.setDefaultLightWeightPopupEnabled(false);

PopupAWTMenu frame = new PopupAWTMenu("Menu over AWT component");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(500,400);
frame.setVisible(true);
}
ecc...

fero86
23-10-2009, 17:38
aaaaaahhhh, grazie!!! é precisamente quello che cercavo! :)
ora lo provo e ti dico.

fero86
23-10-2009, 17:40
funziona che é una meraviglia :D
grazie ancora!