Sha*_*oux 8 java swing always-on-top
我正在尝试在未修饰的alwaysOnTop框架中创建一种工具栏.因此,我希望我的框架位于我的主框架之上,但不希望我的框架位于其他程序的框架之上.我试过这段代码:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是尽管使用了JDialog并且对所有者进行了精确处理,框架仍然位于其他应用程序之上(至少使用Ubuntu.可能结果与其他操作系统不同?)
编辑:好的,我在我的对话框中尝试了这段代码:
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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当主窗口松散焦点时,对话框会抢回焦点,我不明白为什么.例如,我运行我的应用程序,我尝试切换到Firefox,Firefox出现并覆盖mainFrame,但A对话框获得焦点并保持在屏幕上.现在,如果我再次选择Firefox,对话框将最终正确消失.你能解释一下为什么对话会得到关注吗?
谢谢
好的,我找到了一个解决方案(不知道这是否是THE解决方案,但是它正在工作,所以...)
我发现了setFocusableWindowState(),它非常适合工具栏。顺便说一句,我不知道我以前的setFocusable(false)是否有任何作用。
下一个问题是此代码使焦点变得非常奇怪:如果我从MyApp切换到Firefox,则会发生以下情况:
focus : MyApp -> Firefox
execution of MyDialog.toFront()
focus : Firefox -> MyDialog
MyDialog not focusable !
focus : MyDialog -> MyApp !!!
Run Code Online (Sandbox Code Playgroud)
结果:什么都没有改变!
因此,我终于有了窍门:在MyDialog.toFront()之后,您将焦点返回给了先前的所有者。我发现没有错误的唯一方法是:mainFrame.toBack()
最终代码:
public class Test {
private static JFrame mainFrame;
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);
setFocusableWindowState(false);
setSize(80,60);
setVisible(true);
mainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
A.this.setAlwaysOnTop(true);
A.this.toFront();
}
@Override
public void windowDeactivated(WindowEvent e) {
A.this.setAlwaysOnTop(false);
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5600 次 |
| 最近记录: |