SWT FileDialog в апплете не отображается - PullRequest
1 голос
/ 27 июля 2011

Я не пользователь SWT, но мне нужна одна из его функций в JApplet, над которым я работаю: FileDialog.И у меня проблема, когда я запускаю апплет без браузера: диалоговое окно не всплывает, никаких исключений не выдается, ничего (кроме мигания окна) не происходит.

Апплет только для пользователей Windows, это требование.

Когда я запускаю тот же апплет из appletviewer в Eclipse, он работает нормально.

Я добавил все библиотеки SWT в PATH в Windows, чтобы они были доступны для ВМ.Я искал по Интернету, но не смог найти ничего, что могло бы мне помочь.

Код, который я использую:

final Display display = new Display();
    final java.awt.Canvas awtParent = new java.awt.Canvas();

    applet.getApplet().add(awtParent);

    final Shell swtParent = SWT_AWT.new_Shell(display, awtParent);
    try {
        FileDialog dialog = new FileDialog(swtParent, SWT.OPEN);
        dialog.setFilterExtensions(getMediaFilesExtensions());
        dialog.setFilterNames(new String[] {"All files", "Media Files"});
        String fileName = dialog.open();
        File[] files = null;
        if (fileName != null) {
            files = new File[] { new File(dialog.getFileName()) };
        }
        return files;
    } finally {         
        display.syncExec(new Runnable () {
            public void run () {
                if (swtParent != null && !swtParent.isDisposed ()) swtParent.dispose ();                    
                display.dispose ();
                applet.getApplet().remove(awtParent);
            }
        });
    }

Этот код вызывается, когда пользователь нажимает кнопку.Остальная часть приложения основана на Swing.

Я работаю на Windows 7 с SWT 3.7.1.Все библиотеки DLL находятся в java.library.path (% PATH% в Windows)

Есть ли у вас какие-либо рекомендации?

Кстати: качание с собственным L & F не вариант.Мне нужен собственный диалог выбора файла.

Это запущенный демонстрационный апплет, который я создал.Требуется: swt-win32-x86-3.7.jar.

package com.applet;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.Arrays;

import javax.swing.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.widgets.*;

public class DemoApplet extends JApplet {
    @Override
    public void init() {
        JPanel mainPanel = new JPanel();
        JButton button = new JButton(new AbstractAction("Select files") {
            @Override
            public void actionPerformed(ActionEvent e) {
                File[] filesNative = getFilesNative();
                String msg = "Selected files: " + Arrays.toString(filesNative);
                JOptionPane.showMessageDialog(null, msg);
            }
        });
        mainPanel.add(button, BorderLayout.CENTER);
        add(mainPanel);
        super.init();
    }

    private File[] getFilesNative() {
        final Display display = new Display();
        final java.awt.Canvas awtParent = new java.awt.Canvas();

        add(awtParent);

        final Shell swtParent = SWT_AWT.new_Shell(display, awtParent);
        try {
            FileDialog dialog = new FileDialog(swtParent, SWT.OPEN);
            dialog.setFilterNames(new String[] {"All files", "Media Files"});
            String fileName = dialog.open();
            File[] files = null;
            if (fileName != null) {
                files = new File[] { new File(dialog.getFileName()) };
            }
            return files;
        } finally {         
            display.syncExec(new Runnable () {
                public void run () {
                    if (swtParent != null && !swtParent.isDisposed ()) swtParent.dispose ();                    
                    display.dispose ();
                    remove(awtParent);
                }
            });
        }
    }
}

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Если вы хотите создать диалог в апплете, вы должны найти родительский фрейм. Я недавно столкнулся с этой проблемой и нашел это полезным: http://www.jguru.com/faq/view.jsp?EID=27423

public Frame findParentFrame(){
    java.awt.Component c = getParent();

    while(true) {
        if(c instanceof Frame)
            return (Frame)c;
        c = c.getParent();
    }
}

Это даст вам родительский фрейм, который вы передадите в конструктор диалога:

FileDialog fd = new FileDialog(findParentFrame(), "Save Building", FileDialog.SAVE);

Обратите внимание, что некоторые браузеры могут блокировать это как всплывающее окно.

1 голос
/ 26 августа 2011

Если вы используете Java SE 6u26, возможно, вы работаете с Ошибка 7056092 - при обновлении до Java SE 6u27 исправлена ​​ошибка, из-за которой диалоги файлов не открывались в приложениях SWT

0 голосов
/ 03 августа 2011

"исключение не выдается, ничего (кроме мигания окна) не происходит" SWT обычно записывает лог-файлы вместо выдачи исключений в случае проблем с отображением (в общем). Я не знаю много о апплетах на основе SWT, но мне было интересно, есть ли в этом случае какой-нибудь лог-файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...