2

同様の質問をした他の人のように、JFileChooser ダイアログ ボックスの生成コードが生成されていることに気付くまで「修正」しようとして気が狂いましたが、他のすべてのウィンドウの下に表示され、関連するタスクバー アイコンがありません。 (そのため、それが存在するという手がかりはまったくありませんでした!)。

私はこれらの同様の質問を認識しています:

...しかし、これらの質問に対する答えは非常に複雑で、GUI 要素をさらに作成する必要があり、それが必要になるとは思えません。

ここで、コンソールと Swing インターフェースを混在させないというアドバイスも承知していますが、できる限りシンプルに保ちたいと考えています。


他の GUI 要素 (JPanel など) を作成せずに、他のウィンドウの上にある JFileChooser (showOpenDialog) ダイアログ ボックスを生成する方法を知りたいです。

注 1: このサイトでは解決策が議論されているようですが、理解するのは困難です。
注2:私が求めていることが不可能な場合は、少なくともダイアログボックスにタスクバーアイコンを与える方法に関する情報が素晴らしいでしょう(これも親を持つ必要はありません)。

現在、埋め込みダイアログボックスを作成している私のコードは次のとおりです。

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

class Client {
    String currentDirectoryFolderPath = "H:\\myFolder";
    javax.swing.JFileChooser jFileChooser =
            new JFileChooser(currentDirectoryFolderPath);
    jFileChooser.setVisible(true); //defaults to invisible?!?
    javax.swing.filechooser.FileNameExtensionFilter fileExtensionFilter
            = new FileNameExtensionFilter(
              comma-separated values and text files",
              "csv", "txt");
    jFileChooser.setFileFilter(fileExtensionFilter);

    //int returnVal = jFileChooser.showOpenDialog(jFileChooser);
    //jFileChooser.showDialog(null, "testing 1--2--3");
    //jFileChooser.requestFocusInWindow();
    //jFileChooser.requestFocus();
    //jFileChooser.showOpenDialog(null);
    //jFileChooser.requestFocus();
    int returnVal = jFileChooser.showOpenDialog(null);

    if(returnVal == JFileChooser.APPROVE_OPTION) {
        System.out.println("You chose to open this file: " +
                           jFileChooser.getSelectedFile().getName());
    }

    System.out.println(JFileChooser.APPROVE_OPTION);
    System.out.println(jFileChooser);
}

コメントされたコードは、私が試した中でうまくいかなかったすべてのものです。

  • ダイアログ ボックスを呼び出す前後さまざまな種類のフォーカス要求、および
  • null を渡す代わりに、ダイアログ ボックス オブジェクト自体を独自の親として指定します (これは試してみる価値があると思いました)。
4

3 に答える 3

3

ダイアログを構成する別のオプション: JFileChooser をサブクラス化し、その createDialog をカスタム設定でオーバーライドします。

public static void main(String[] args) throws AWTException {
    Action action = new AbstractAction("open in tray") {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Please select the file");
            JFileChooser fc = new JFileChooser() {

                @Override
                protected JDialog createDialog(Component parent)
                        throws HeadlessException {
                    JDialog dialog = super.createDialog(parent);
                    // config here as needed - just to see a difference
                    dialog.setLocationByPlatform(true);
                    // might help - can't know because I can't reproduce the problem
                    dialog.setAlwaysOnTop(true);
                    return dialog;
                }

            };
            int retValue = fc.showOpenDialog(null);
            if(retValue == JFileChooser.APPROVE_OPTION){
                System.out.println(fc.getSelectedFile());
            }else {
                System.out.println("Next time select a file.");
            }
        }
    };
    TrayIcon trayIcon = new TrayIcon(XTestUtils.loadDefaultImage(), "open in tray");
    trayIcon.addActionListener(action);
    SystemTray.getSystemTray().add(trayIcon); 
}

問題を再現できないため(Windows Vista、jdk7)、それが役立つかどうかはわかりません-何を試しても、おそらくOSに大きく依存して、ダイアログがすべての上に表示されます。

于 2013-07-03T08:47:19.003 に答える
3

まず、独自のダイアログを作成しsetAlwaysOnTop、ウィンドウをウィンドウの z オーダーの一番上に移動するために使用できます。これはOS固有なので、すべてのOSで機能するとは限りません...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FileChooser {

    public static void main(String[] args) {
        new FileChooser();
    }
    private int state = JFileChooser.ERROR_OPTION;

    public FileChooser() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFileChooser chooser = new JFileChooser();
                chooser.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        System.out.println(evt.getPropertyName());
                    }
                });
                chooser.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (JFileChooser.CANCEL_SELECTION.equals(e.getActionCommand())) {
                            state = JFileChooser.CANCEL_OPTION;
                            SwingUtilities.windowForComponent((JFileChooser) e.getSource()).dispose();
                        } else if (JFileChooser.APPROVE_SELECTION.equals(e.getActionCommand())) {
                            state = JFileChooser.APPROVE_OPTION;
                            SwingUtilities.windowForComponent((JFileChooser) e.getSource()).dispose();
                        }
                    }
                });
                JDialog dialog = new JDialog();
                dialog.setAlwaysOnTop(true);
                dialog.setTitle("Open it sucker");
                dialog.setModal(true);
                dialog.add(chooser);
                dialog.pack();
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);
                switch (state) {

                    case JFileChooser.APPROVE_OPTION:
                        System.out.println("approved");
                        break;
                    case JFileChooser.CANCEL_OPTION:
                        System.out.println("cancled");
                        break;
                    default:
                        System.out.println("Broken");
                        break;

                }
            }
        });
    }
}

第二に。タスクアイコンを取得したい場合は、 のJFrame代わりにを作成する必要があると思いますJDialogActionListenerこれは、表示されたときにフレームがブロックされないことを意味し、呼び出し元にフィードバックを提供するには に頼る必要があります

于 2013-07-03T03:37:16.350 に答える
1

他の誰かがこれに出くわした場合に備えて、かなりエレガントなタスクバー アイコンを持つ JFileChooser を作成する実用的なソリューションがあります。

JFileChooser chooser = new JFileChooser();
JDialog wrapper = new JDialog((Window)null);
wrapper.setVisible(true);
chooser.showDialog(wrapper);

明らかにwrapper、場所の設定、サイズ変更可能かどうかなど、さまざまな方法で操作できます。(Window)nullJDialog の親として使用すると、ダイアログのタスクバーにアイコンが表示されます。これは、必要なshowDialogときに JFileChooser によって継承されます。showOpenDialog親がwrapperダイアログです。

于 2019-06-09T18:21:57.980 に答える