Полноэкранные модальные диалоги Java - PullRequest
2 голосов
/ 24 мая 2011

Как создать собственный модальный JDialog, который можно использовать как внутренний диалог? Для использования в FullscreenExclusiveMode.

У меня есть JScrollPane (с огромной полосой прокрутки), полный огромных кнопок, таких как:

+----------------------+------+
|         FOO          |  /\  |
|______________________+------+
|                      |______|
|         BAR          |      |
|______________________|  ==  |
|                      |______|
|         BIZ          |      |
+______________________+------+
|                      |  \/  |
|----------------------+------+

Мне нужно, чтобы пользователь использовал гигантскую полосу прокрутки для прокрутки и коснулся определенной кнопки, чтобы выбрать ее и закрыть диалог. Диалог в полноэкранном монопольном режиме. Кнопка закрытия должна быть отключена, и ей не нужно иметь кнопки «ОК» или «Отмена», какую бы кнопку они не нажимали, нужно обновить значение и затем вызвать frame.dispose () в диалоговом окне.

Сейчас я использую внутреннюю рамку, но рамка не всплывает перед всем остальным, потому что я не использую JDesktop. Я также пробовал JDialog, но это минимизирует приложение.

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

РЕДАКТИРОВАТЬ: просмотрел эти классы и попробовал фабрику всплывающих окон, но кажется, что всплывающие окна не работают надежно в полноэкранном режиме.

РЕДАКТИРОВАТЬ: Попытка JOptionPane.createInternalFrame (), вот демонстрация, с которой я работаю, но она пока не работает.

public class FullscreenDialog {

    public static final void main(final String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//uses os window manager

        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800,600));

        final JLabel label = new JLabel("Something to say.");
        panel.add(label);
        final JFrame fullscreenFrame = new JFrame();
        fullscreenFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        fullscreenFrame.setUndecorated(true);//To remove the bars around the frame.
        fullscreenFrame.setResizable(false);//resizability causes unsafe operations.
        fullscreenFrame.setContentPane(panel);
        fullscreenFrame.validate();
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(fullscreenFrame);//actually applies the fullscreen.

        final JOptionPane optionPane = new JOptionPane();
        optionPane.add(new JLabel("Some alert"));
        final JButton button = new JButton();
        button.setText("Press me.");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                label.setText("worked");
                optionPane.setValue(button);
            }
        });
        JInternalFrame frame  = optionPane.createInternalFrame(panel, "Internal Dialog");
        frame.setVisible(true);
    }
}

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Аргумент message для конструктора JOptionPane может быть Component, а также строкой, например, это может быть ваш JScrollPane.

Чтобы удалить стандартные кнопки из панели параметроввызовите setOptions(Object[]) с пустым массивом.

2 голосов
/ 25 мая 2011

JOptionPane.showXXXDialog (...) допускает множество настроек при создании собственного внутреннего диалога.

1 голос
/ 26 мая 2011

попробуйте это ..

.
.
.
            final JOptionPane optionPane = new JOptionPane();
            optionPane.add(new JLabel("Some alert"));
            final JButton button = new JButton();
            button.setText("Press me.");
            button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
                    label.setText("worked");
                    fullscreenFrame.invalidate();
                    fullscreenFrame.repaint();
                    optionPane.setValue(button);
                }
            });
            JInternalFrame frame  = optionPane.createInternalFrame(panel, "Internal Dialog");
            frame.getContentPane().removeAll();
            JPanel pnl = new JPanel(new BorderLayout());
            pnl.add( button, BorderLayout.SOUTH );
            pnl.add( new JScrollBar(), BorderLayout.CENTER );
            frame.getContentPane().add( pnl );
            frame.setVisible(true);
...