Java модальное окно с кнопкой максимизации - PullRequest
9 голосов
/ 10 октября 2010

Как я могу создать окно, которое является модальным и имеет кнопку максимизации?
Так можно ли создать модальное JFrame или создать JDialog с кнопкой максимизации?

Ответы [ 3 ]

11 голосов
/ 10 октября 2010

В большинстве случаев модальные окна (такие как JDialog) не имеют кнопки максимизации просто потому, что они вообще не должны быть максимизированы (или минимизированы).

Можно с некоторыми хитростями добавить кнопку maximise, но это было бы полностью против способа, которым JDialog должен работать. Если вам нужна кнопка максимизации, лучшим решением будет использование JWindow или JFrame вместо JDialog. Эти окна поддерживают максимизацию и минимизацию.


ВНИМАНИЕ: Вы не должны этого делать, несмотря ни на что.

Хитрость, чтобы сделать это в JDialog:

setUndecorated(true);
getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
2 голосов
/ 17 июня 2014

Решение 1: протестировано в Windows

Я использовал JFrame для модального окна

JFrame mainWindow = new JFrame;
mainWindow.setVisible(true);
JFrame modalWindow = new JFrame();
// The next two sentences gives modalWindow modal beahaviour
mainWindow.setEnabled(false);
mainWindow.setFocusable(false);
modalWindow.setVisible(true);

Решение 2: протестировано в Ubuntu

Я добавил WindowFocusListener

addWindowFocusListener(new java.awt.event.WindowFocusListener() {
    public void windowGainedFocus(java.awt.event.WindowEvent evt) {}
    public void windowLostFocus(java.awt.event.WindowEvent evt) {
        formWindowLostFocus(evt);}

private void formWindowLostFocus(java.awt.event.WindowEvent evt) {
    this.requestFocus();
    this.toFront();}
0 голосов
/ 25 апреля 2012

Вот альтернативный / чуть более подробный ответ.

Попробуйте Вы пропустили кнопку увеличения? ( ранее здесь ). Это github архив статей и кода блога Сантоша Кумара Тектури с ныне несуществующего сайта JRoller.

Это полный служебный класс, который делает Frame похожим на другие ответы. Он включает добавление WindowListener к фрейму, чтобы оставить фрейм поверх его владельца и оставить фрейм его владельца отключенным (предупреждение: в методе windowClosed это, вероятно, должно быть frame.removeWindowListener(this); и WindowListener для владельца чтобы держать фрейм поверх него и удалить слушателя. Он также использует свой собственный EventQueue для обработки событий. Обратите внимание, что это старая запись, так как, как упоминалось в коде, могут быть более новые API для более эффективной работы с этим кодом. .

Вот основная функция. Смотрите ссылку для отдыха. Примечание: код в хранилище отличается от статьи; Я считаю, что хранилище более развито.

// show the given frame as modal to the specified owner.
// NOTE: this method returns only after the modal frame is closed.
public static void showAsModal(final Frame frame, final Frame owner){
    frame.addWindowListener(new WindowAdapter(){
        public void windowOpened(WindowEvent e){
            owner.setEnabled(false);
        }

        public void windowClosing(WindowEvent e) {
            owner.setEnabled(true);
        }

        public void windowClosed(WindowEvent e){
            frame.removeWindowListener(this); // originally called on owner
        }
    });

    owner.addWindowListener(new WindowAdapter(){
        public void windowActivated(WindowEvent e){
            if(frame.isShowing()){
                frame.setExtendedState(JFrame.NORMAL);
                frame.toFront();
            }else
                owner.removeWindowListener(this);
        }
    });

    owner.toFront();
    frame.setVisible(true);
    try{
        new EventPump(frame).start();
    } catch(Throwable throwable){
        throw new RuntimeException(throwable);
    }
}
...