Java 模式对话框位于Opensuse上其他窗口的背面
在我的应用程序中,有由JavaSWT编写的对话框屏幕。当模式对话框(警告/错误/文件对话框等)打开时,在单击父屏幕后,它不能停留在父屏幕的顶部,或者在主屏幕的后面打开。只能通过按ALT+tab键打开该对话框。此问题发生在Opensuse 11.04上。它不会出现在Windows上 Main和ShellExample类用于测试问题。当您按下Openningshell中的“打开模式对话框”按钮时,FileDialog会出现。MessageDialog在顶部打开,但单击外壳时,它会返回 这里是主课堂Java 模式对话框位于Opensuse上其他窗口的背面,java,swt,modal-dialog,opensuse,Java,Swt,Modal Dialog,Opensuse,在我的应用程序中,有由JavaSWT编写的对话框屏幕。当模式对话框(警告/错误/文件对话框等)打开时,在单击父屏幕后,它不能停留在父屏幕的顶部,或者在主屏幕的后面打开。只能通过按ALT+tab键打开该对话框。此问题发生在Opensuse 11.04上。它不会出现在Windows上 Main和ShellExample类用于测试问题。当您按下Openningshell中的“打开模式对话框”按钮时,FileDialog会出现。MessageDialog在顶部打开,但单击外壳时,它会返回 这里是主课堂
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Display display = new Display();
final Shell shell = new Shell(display);
shell.setLocation(0,0);
shell.setSize(500, 500);
shell.setLayout(new GridLayout());
FormToolkit toolkit = new FormToolkit(shell.getDisplay());
Button okButton = toolkit.createButton(shell, " Open Shell ", SWT.NONE);
okButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ShellExample mainDialog = new ShellExample(shell);
mainDialog.open();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
这是ShellExample类
public class ShellExample extends Dialog {
private Shell shell;
public ShellExample(Shell parent) {
super(parent, SWT.NO_TRIM | SWT.PRIMARY_MODAL);
// TODO Auto-generated constructor stub
}
public Object open() {
// TODO Auto-generated method stub
shell = new Shell(getParent(), getStyle());
createContents();
shell.open();
shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return null;
}
private void createContents() {
// TODO Auto-generated method stub
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
shell.setSize(ge.getMaximumWindowBounds().width,ge.getMaximumWindowBounds().height);
shell.setText(getText());
shell.setLayout(new FillLayout());
shell.setLayout(new GridLayout());
FormToolkit toolkit = new FormToolkit(shell.getDisplay());
Button okButton = toolkit.createButton(shell, " open modal dialog ", SWT.NONE);
okButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
FileDialog fd = new FileDialog(shell, SWT.SAVE);
fd.setText("file dialog");
fd.open();
// MessageDialog.open(MessageDialog.WARNING , shell, "warning_title", "warning_message", SWT.APPLICATION_MODAL);
}
});
}
}
有什么建议吗
谢谢。在Linux中,实现此行为取决于窗口管理器(Gnome、KDE、XFCE、启蒙等)。我知道一些Linux窗口管理器和平铺窗口管理器不支持模态窗口。要了解您正在尝试的操作是否可行,您应该查看您正在使用的窗口管理器的文档,看看它是否支持它。
这可以通过查看NET\u WM标志找到。您可能正在查找的是\u NET\u WM\u STATE\u model。关于这一点的一些文档可以在免费的桌面标准网站上找到,撰写本文时的最新规范是我使用Gnome窗口管理器。我意识到,如果主屏幕是全屏的,那么打开的窗口就会出现在主屏幕下面。临时解决方案不是使用全屏。我也不确定这个问题的确切原因,也找不到任何其他解决方案。现在,当全屏窗口打开时,窗口管理器基本上会关闭渲染,并将显示缓冲区直接转发到显示系统,我知道如果一个单独的弹出窗口出现在顶部,并且有选项来禁用全屏窗口的直接通过,启蒙运动会禁用这个功能,在谷歌搜索的3分钟内,我看不到一个使用gnome的方法。通过在gnome bug跟踪器上打开一个bug,您可能会得到更多的帮助,这个bug是关于全屏窗口创建的对话框不会显示的事实。