|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
[Java] componente AWT dentro interfaccia Swing
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! |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Se la imposti a false forzi l'utilizzo del popoup heavyweight. Commentando la riga in grassetto mi ritrovo nella tua situazione: Codice:
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. Codice:
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...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 23-10-2009 alle 17:12. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
aaaaaahhhh, grazie!!! é precisamente quello che cercavo!
ora lo provo e ti dico. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
funziona che é una meraviglia
grazie ancora! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:47.




















