Próbuję utworzyć rodzaj paska narzędzi w nieodnowionej ramce alwaysOnTop. Dlatego chcę, aby moja ramka znajdowała się na mojej głównej ramce, ale nie na ramkach innych programów. Próbowałem ten kod:Ramka zawsze na szczycie mojego programu tylko
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);
}
}
}
Ale mimo stosowania JDialog i doprecyzowanie właściciela, pobyt ramki na wierzchu innych aplikacji (przynajmniej w Ubuntu Może wynik jest inny z innego systemu operacyjnego.?)
EDIT: Ok, próbowałem ten kod dla mojego okna:
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();
}
});
}
}
problem jest teraz, że gdy okno główne luźne ostrości, okno kradnie ostrość z powrotem, a ja nie rozumiem dlaczego. Na przykład uruchamiam moją aplikację, staram się przełączyć na Firefox, pojawia się Firefox i obejmuje mainFrame, ale okno dialogowe A dostaje fokus i pozostaje na ekranie. Teraz, jeśli ponownie wybiorę Firefoksa, okno dialogowe ostatecznie zniknie. Czy możesz mi wyjaśnić, dlaczego dialog się skupia?
Dzięki
myślę, że trzeba uciekać się do korzystania jakieś rodzimej włamania poprzez JNI/JNA – MadProgrammer
'klasa A rozszerza JFrame'? –
co się stanie, jeśli usuniesz 'setAlwaysOnTop()'? Zwykle ramka powinna pozostać na wierzchu innych klatek. 'SetAlwaysOnTop()' ustawia flagę dla OS – GameDroids