Вопрос по windows, java, swing – как показать JOptionPane в верхней части всех окон

11

Я создал DialogUtil, который показывает номера JOptionPan в разных ситуациях. иногда в моем классе действия вызывают этот метод с нулевыми параметрами, как показано ниже.

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

В этом случае JOptionPane не появляется в верхней части окна.

How can I add something to JOptionPane to appears always on the top?

public static void showNotExist(JPanel panel, String action) {
    JOptionPane.showMessageDialog(panel, new JLabel(action.concat(" doesn't exist."), 2));
}
"sometimes in my action class call to this method with null parameters as below."  Зачемnull? Andrew Thompson
Потому что я вызываю этот метод в теле класса, который не имеет ссылки на GUI или фрейм. itro
Просто передайте родителя в качестве аргумента вместоJPanel пусть это будет основной контейнер, т.е.JFrameтогда вам действительно не нужно беспокоиться о таких вещах :-) nIcE cOw

Ваш Ответ

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

Попробуйте указать корневую панель в качестве первого значения в разделе showMessageDialog

4

WebOptionPane или жеWebPanel есть, но если они основаны наJOptionPaneто проблема в том, что вы проходитеnull для этого первого аргумента кshowXXX() метод. Если вы хотитеJOptionPane чтобы быть модальным - что заставляет его находиться перед указанным окном - тогда вам нужно указать окно (т.е.JFrame - для этого первого аргумента.

+1 правильное предложение я добавил остальное
@itro, я хочу сказать, что вы можете захотеть получить что-то нереальное. Вы должны указать кадр; если это должен быть самый передний кадр, то вы должны выяснить, какой это. Это статический методFrame.getFrames() который перечисляет все существующиеFrame объекты, и есть способWindow.getFocusOwner() который вы можете использовать, чтобы выяснить, еслиFrame самый передний. Ваш служебный метод должен найти правильныйFrame и использовать это.
@itro: И я хочу единорога!
Вы правы, и я знаю об этом, но я хочу быть на вершине, какой первый аргумент и без указания окон? itro
Вы очень смешные. Спасибо за вашего единорога, я имею в виду, я хочу, чтобы JOPtionPan был на вершине окна. itro
6

        JFrame jf=new JFrame();
        jf.setAlwaysOnTop(true);
        int response = JOptionPane.showConfirmDialog(jf,"Message", "Title", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
Это легко и точно. Спасибо!
14

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.

1

свойство класса setAlwaysOnTop (true); в любом месте в конструкторах до JOptionPane.showMessageDialog (null, & quot; OKay & quot;);

Я использую его для копирования файла и проверки, даже не нужен JFrame, но JOptionPane.

Постскриптум Если вы не хотите, чтобы основной JFrame всегда отображался сверху, вам нужно создать фиктивный JFrame или сбросить свойство setAlwaysOnTop (false); после JOptionPane.

5

JOptionPane is called out of EDT, then only toolbar (caption that came from Native OS is visible on the screen, RootPane isn't visible) is visible on the screen

there you can to test JOptionPanes features, where JOptionPane.showInternalMessageDialog() makes troubles in all cases that there is another JDialog with setModal(true), real reason I dont know, same should be with ModalityTypes

not possible to showing two JOptionPanes on the screen in the same time

код

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");
            }
        });
    }
}
@ Downvoter: Пожалуйста, будьте осторожны, чтобы объяснить причину и действия !!!

Похожие вопросы