В моем приложении есть диалоговые экраны, написанные java SWT. Когда открыто модальное диалоговое окно (диалог предупреждения/ошибки/файла и т. д.), оно не может оставаться поверх родительского экрана после нажатия на родительский экран или открывается за основным экраном. Диалог можно открыть, только нажав ALT+Tab. Эта проблема возникает на Opensuse 11.04. Это не происходит в Windows.
Классы Main и ShellExample предназначены для проверки проблемы. Когда вы нажимаете кнопку «открыть модальный диалог» в открывающейся оболочке, 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);
}
});
}
}
Какие-либо предложения?
Спасибо.