2009-06-02 2 views
52

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

+7

Я видел некоторые приложения, которые показывают другое диалоговое окно при нажатии на кнопку закрытия, сообщающее, нажать одну из других кнопок вместо этого. Genius! –

ответ

1

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

+1

Что такое PL & F? Благодарю. – kenshinji

+0

PL & F является подключаемым Look & Feel. Уродливый способ Swing может взять на себя произвольный Look & Feel. –

+2

Почему уродливый? Какой был бы правильный способ сделать это? –

53

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

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

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

13

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

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

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

9

Начиная с 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

Это «не будет исправлено» на [параде ошибок] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5085932). –

+0

Это не совсем правильно. Подклассификация/создание JDialog на OS X (проверено на El Capitan) не удаляет никаких кнопок из заголовка, а также не содержит никакой комбинации настроек (и да, я пробовал каждую комбинацию). Только 'setUndecorated (true)' удаляет их все, но вместе с ним идет строка заголовка. Вы можете, конечно, изменить поведение кнопок панели заголовка, но что касается внешнего вида ...это очень сложная ситуация, когда я потратил слишком много времени на неудовлетворительные решения и не переносимый код. – EntangledLoops

+0

@EntangledLoops Спасибо, что внесли свой комментарий! Хотя это правда, что JDialog не отменяет кнопки «Свернуть /« максимизировать »в диалоговом окне OS X, он отключает минимизацию. У меня нет Mac на руках, чтобы проверить это, но я готов поспорить, что кнопка максимизации просто изменяет ее размеры, и если вы установите 'dialog.setResizable (false)', зеленая кнопка также отключится! Во всяком случае, как я сказал в своем ответе, это расстраивает то, что мы не имеем полного контроля над этим, но я могу себе представить, как кошмарные могут быть для разработчиков JSE для программирования на всех платформах. ; 3 – Supuhstar

-3
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]); 
    } 
} 
+7

это приведет к удалению любых кнопок, добавленных в диалог, а не кнопок закрытия диалогового окна. –

+0

Это не влияет на кнопки заголовка (OS X). – EntangledLoops

+1

Это на самом деле довольно забавно и оставляет ваше приложение в непринужденном состоянии, если вы _ever_ используете кнопки x3 – Supuhstar

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"); 
       } 
     } 
}); 
Смежные вопросы