Sto provando a creare un tipo di barra degli strumenti in un frame alwaysOnTop non decorato. Quindi, voglio che il mio frame sia sopra il mio frame principale, ma non sopra i frame di altri programmi. Ho provato questo codice:Frame sempre sopra il mio programma solo
public class Test {
private static JFrame mainFrame;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
mainFrame = new JFrame("test");
mainFrame.setSize(800,600);
mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainFrame.setVisible(true);
A a = new A();
}
});
}
public static class A extends JDialog {
public A() {
super(mainFrame);
setAlwaysOnTop(true);
setFocusable(false);
setSize(80,60);
setVisible(true);
}
}
}
Ma nonostante l'uso di JDialog e precisando il proprietario, il soggiorno cornice in cima ad altre applicazioni (almeno con Ubuntu Forse il risultato è differente con l'altro sistema operativo.?)
EDIT: Ok, ho provato questo codice per il mio dialogo:
public static class A extends JDialog {
public A(String name) {
super(mainFrame, name);
setAlwaysOnTop(true);
setFocusable(false);
setSize(80, 60);
setVisible(true);
mainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
A.this.setAlwaysOnTop(true);
}
@Override
public void windowDeactivated(WindowEvent e) {
// A.this.setAlwaysOnTop(false);
A.this.toBack();
}
});
}
}
il problema ora è che quando la finestra principale di messa a fuoco sciolti, la finestra di dialogo ruba la messa a fuoco posteriore e non capisco perché. Ad esempio, eseguo la mia app, provo a passare a Firefox, compare Firefox e copre MainFrame, ma la finestra di dialogo A diventa attiva e rimane sullo schermo. Ora, se seleziono di nuovo Firefox, alla fine la finestra di dialogo scomparirà correttamente. Potresti spiegarmi perché il dialogo ha il focus?
Grazie
Penso che è necessario ricorrere all'utilizzo di un qualche tipo di hack nativa tramite JNI/JNA – MadProgrammer
'classe A estende JFrame'? –
cosa succede se rimuovi 'setAlwaysOnTop()'? Normalmente, Frame dovrebbe rimanere sopra altri frame. Il 'setAlwaysOnTop()' sta impostando un flag per l'OS – GameDroids