Подтвердить что ты не робот

Удалите кнопку "X" в Swing JDialog

Есть ли способ удалить кнопку закрытия ( "X" ) из строки заголовка JDialog?

4b9b3361

Ответ 1

Вы можете удалить весь заголовок диалога, вызвав dialog.setUndecorated(true), но это означает, что диалог больше нельзя перемещать.

Вы также можете выполнить dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE), чтобы кнопка ничего не делала.

Кроме того, я не думаю, что есть способ полностью удалить X.

Ответ 2

Я считаю, что вы можете вызвать dialog.setUndecorated(true), чтобы удалить строку заголовка. Не уверен только о "Х".

Удаление "X" может быть отличной идеей, так как вы хотите, чтобы ваши пользователи могли легко закрыть диалоговое окно.

Лучше всего контролировать, что происходит, когда пользователи нажимают кнопку "X", используя dialog.setDefaultCloseOperation или WindowListener.

Ответ 3

Начиная с Java 1.7 (AKA Dolphin или Java 7), вы не можете отключить или закрыть кнопку закрытия в окне. Вы можете удалить/отключить кнопку максимизации с помощью frame.setResizable(false), и вы можете удалить кнопки минимизации и максимизации, используя java.awt.Dialog или класс, который расширяет его, например javax.swing.JDialog. Вы можете удалить строку заголовка, границы и кнопки с помощью frame.setUndecorated(true), и вы можете полностью контролировать видимость всех кнопок в строке заголовка (при потере некоторой межплатформенной совместимости и интеграции ОС) с помощью frame.setDefaultLookAndFeelDecorated(true) (при условии, что это JFrame или JDialog). Это все, что я вижу возможным с помощью текущего JDK.

Ответ 4

Вот мой опыт:

  • Пробовал использовать setUndecorated(true): сделал целым Dialog невидимым.
  • Пробовал setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE): это вообще не меняло поведения. Мое диалоговое окно все еще закрыто. Установка операции закрытия по умолчанию на DO_NOTHING_ON_CLOSE делегирует операцию закрытия методу windowClosing() зарегистрированного WindowListener.

Что для меня работало:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//Remove any existing WindowListeners
for ( WindowListener wl : this.getWindowListeners())
        this.removeWindowListener(wl);
this.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
                 if ("Optional condition") {
                      JOptionPane.showMessageDialog(null, "You cannot close this window");
                 }
        }
});

Ответ 5

Угадайте, установите его как PL & F, украсив и удалив компонент по имени.

Ответ 6

static public void removeButtons(Component c){
    if (c instanceof AbstractButton){
        String accn = c.getAccessibleContext().getAccessibleName();
        Container p=c.getParent();
        //log.debug("remove button %s from %s",accn,p.getClass().getName());
        c.getParent().remove(c);
    }
    else if (c instanceof Container){
        //log.debug("processing components of %s",c.getClass().getName());
        Component[] comps = ((Container)c).getComponents();
        for(int i = 0; i<comps.length; ++i)
            removeButtons(comps[i]);
    }
}