web-dev-qa-db-ja.com

すべてのウィンドウの上部にJOptionPaneを表示する方法

さまざまな状況でJOptionPanの数を表示するDialogUtilを作成しました。以下のように、アクションクラスでnullパラメータを使用してこのメ​​ソッドを呼び出すことがあります。

DialogUtil.showNotExist(null,xml.getName().concat(" is null or"));

この場合、JOptionPaneはウィンドウの上部に表示されません。

JOptionPaneに何かを追加して常に上部に表示するにはどうすればよいですか?

public static void showNotExist(JPanel panel, String action) {
    JOptionPane.showMessageDialog(panel, new JLabel(action.concat(" doesn't exist."), 2));
}
15
itro

2つの問題が考えられます

  • JOptionPaneがEDTから呼び出され、ツールバーのみ(ネイティブOSからのキャプションが画面に表示され、RootPaneは表示されません)が画面に表示されます

  • jOptionPanes機能をテストすることができます。JOptionPane.showInternalMessageDialog()は、setModal(true)を持つ別のJDialogがあるすべてのケースで問題を引き起こします。

  • 画面に2つのJOptionPanesを同時に表示することはできません

コード

import Java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JButton;
import Java.awt.BorderLayout;
import Java.awt.Dimension;
import Java.awt.EventQueue;
import Java.awt.Toolkit;
import Java.awt.event.ActionListener;
import Java.awt.event.ActionEvent;
import Java.awt.event.MouseAdapter;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JRootPane;
import javax.swing.Timer;
//http://stackoverflow.com/questions/8670297/make-Java-swing-modal-dialog-behave-like-mac-osx-dialogs
public class ModalDialogDemoFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private ModalDialogDemoFrame modalDialogDemo;

    public ModalDialogDemoFrame() {
        modalDialogDemo = this;
        setBounds(100, 100, 400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton buttonDialog = new JButton("Open Dialog");
        buttonDialog.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                // Create a Modal Dialog with this Frame as Parent.
                ModalDialog modalDialog = new ModalDialog(modalDialogDemo, true);
                modalDialog.setVisible(true);
            }
        });
        getContentPane().add(buttonDialog, BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                try {
                    ModalDialogDemoFrame window = new ModalDialogDemoFrame();
                    window.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
//http://stackoverflow.com/questions/4577424/distinguish-between-a-single-click-and-a-double-click-in-Java/4577475#4577475
class ClickListener extends MouseAdapter implements ActionListener {

    private final static int clickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval");
    private MouseEvent lastEvent;
    private Timer timer;

    public ClickListener() {
        this(clickInterval);
    }

    public ClickListener(int delay) {
        timer = new Timer(delay, this);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() > 2) {
            return;
        }
        lastEvent = e;
        if (timer.isRunning()) {
            timer.stop();
            doubleClick(lastEvent);
        } else {
            timer.restart();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        timer.stop();
        singleClick(lastEvent);
    }

    public void singleClick(MouseEvent e) {
    }

    public void doubleClick(MouseEvent e) {
    }
}

class ModalDialog extends JDialog {

    private static final long serialVersionUID = 1L;

    public ModalDialog(JFrame parent, boolean modal) {
        Dimension dimensionParentFrame = parent.getSize();
        setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width / 2, 75));
        Dimension dimensionDialog = getSize();
        int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width) / 2);
        setLocation(x, parent.getY() + parent.getInsets().top);
        //setUndecorated(true);
        setModal(modal);
        //setUndecorated(true);
        //getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG);
        setModalityType(ModalityType.APPLICATION_MODAL);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        final JButton buttonClose = new JButton("Close");
        buttonClose.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
//ok
                /*JOptionPane.showMessageDialog(buttonClose,
                "Eggs are not supposed to be green.",
                "Inane warning",
                JOptionPane.WARNING_MESSAGE);*/
//uncomment for un_handled GUI, JOptionPane is behing JFrame I think....
                /*JOptionPane.showInternalMessageDialog(buttonClose,
                "Eggs are not supposed to be green.",
                "Inane warning",
                JOptionPane.WARNING_MESSAGE);*/
//ok
                /*JOptionPane.showConfirmDialog(buttonClose,
                "Eggs are not supposed to be green.",
                "Inane warning",
                JOptionPane.WARNING_MESSAGE);*/
//ok                
                /*JOptionPane.showMessageDialog(null,
                "Eggs are not supposed to be green.",
                "Inane warning",
                JOptionPane.WARNING_MESSAGE);*/
//uncomment for un_handled GUI
//Exception occurred during event dispatching:
//Java.lang.RuntimeException: JOptionPane: parentComponent does not have a valid parent                
                /*JOptionPane.showInternalMessageDialog(null,
                "Eggs are not supposed to be green.",
                "Inane warning",
                JOptionPane.WARNING_MESSAGE);*/
//ok                
                JOptionPane.showConfirmDialog(null,
                        "Eggs are not supposed to be green.",
                        "Inane warning",
                        JOptionPane.WARNING_MESSAGE);
                dispose();
            }
        });
        add(buttonClose, BorderLayout.CENTER); // comment for listening
        addMouseListener(new ClickListener() {

            @Override
            public void singleClick(MouseEvent e) {
                System.out.println("single");
            }

            @Override
            public void doubleClick(MouseEvent e) {
                System.out.println("double");
            }
        });
    }
}
5
mKorbel

このようなことを試しましたか?

JOptionPane optionPane = new JOptionPane();
JDialog dialog = optionPane.createDialog("Title");
dialog.setAlwaysOnTop(alwaysOnTop);
dialog.setVisible(true);

オペレーティングシステムがダイアログを常に上に置くことができるという保証はありませんが、多くの場合は機能します。

既存のウィンドウまたはダイアログがあり、それを一番上に表示したいが、alwaysOnTopを永続的に設定したくない場合は、alwaysOnTopの古い値をそのままにしておいても、これは機能するはずです。

boolean supported = window.isAlwaysOnTopSupported();
boolean old_alwaysOnTop = window.isAlwaysOnTop();
if (supported) {
  window.setAlwaysOnTop(true);
}
window.toFront();
window.requestFocus();
if (supported) {
  window.setAlwaysOnTop(old_alwaysOnTop);
}

そのコードはSwingThreadでのみ実行してください。

14
Enwired

次のコードを使用して、JOptionPaneを常に上に設定できます。

        JFrame jf=new JFrame();
        jf.setAlwaysOnTop(true);
        int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
10
Arvind Kumar

WebOptionPaneまたはWebPanelが何であるかはわかりませんが、それらがJOptionPaneに基づいている場合、問題はnullを渡すことですshowXXX()メソッドの最初の引数。 JOptionPaneをモーダルにしたい場合(指定したウィンドウの前面に表示するように強制する場合)、最初にウィンドウ(つまり、JFrame)を指定する必要があります。引数。

クラスがJFrameを拡張している場合は、クラスプロパティsetAlwaysOnTop(true)を設定するだけです。 JOptionPane.showMessageDialog(null、 "OKay");の前のコンストラクター内の任意の場所。

ファイルのコピーとチェックに使用します。JFrameは必要ありませんが、JOptionPaneが必要です。

追伸メインのJFrameを常に上部に表示したくない場合は、ダミーのJFrameを作成するか、プロパティsetAlwaysOnTop(false);をリセットする必要があります。 JOptionPaneの後。

1
Ken
public static void showNotExist(JPanel panel, String action) {
    JOptionPane.showMessageDialog(rootPane, new JLabel(action.concat(" doesn't exist."), 2));
}

ShowMessageDialogセクションの最初の値としてルートペインを指定してみてください

1
BasuruK