2014-10-02 1 views
2

При исследовании проблемы кажется, что большинство людей хотят сделать обратное (например, удалить кнопку «Минимум/закрыть»). я не имел никакого успеха, используя reoccurrent setUndecorated и setDefaultCloseOperationJDialog не показывает кнопку свернуть/закрыть

Вот мой код:

private class TestDialog extends JDialog 
{ 
    public static final String title_ = "Test Dialog"; 

    public TestDialog(JFrame parent) 
    { 
     super(parent,title_,true); 
     setMinimumSize(new Dimension(500,500)); 
     setLocationRelativeTo(null); 
     setUndecorated(false); 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    } 
} 

Когда появится диалоговое окно, я получаю следующее:

enter image description here

Другое info:
ОС: Ubuntu
Java-версия: 1.7.0_55

+0

Вы хотите удалить кнопки закрытия/уменьшения? Почему вы не наследуете JWindow, а не JDialog? –

+0

Я хочу, чтобы кнопки закрытия/минимизации отображались. Я думаю, что JWindow будет плохо приспособлен, учитывая, что он не встраивает строку заголовка. – Harry

+0

Используйте JFrame вместо JDialog – Gladiator

ответ

3

Непонятно, где все пошло не так, но приведенный ниже пример работает на Ubuntu 12, Java 6; это может помочь вам решить проблему. Обратите внимание, что всеtop-level container s должно быть построено на event dispatch thread.

enter image description here

import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 


public class TestDialog extends JDialog { 

    public static final String title = "Test Dialog"; 

    public TestDialog(JFrame parent) { 
     super(parent, title, true); 
     add(new JPanel(){ 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(320, 240); 
      } 
     }); 
     pack(); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    } 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestDialog(null).setVisible(true); 
      } 
     }); 
    } 
} 
+0

Спасибо за ваш ответ @trashgod. Пробовав ваш пример, я все еще не получаю кнопку закрытия, которую вы, похоже, получаете. Я установил более раннюю версию jdk (1.6.0) и все еще ничего. Единственное, что я могу сейчас подумать, это проблема с Ubuntu 14.04 и/или GNOME. – Harry

+0

@Harry: Выглядит так же на Ubuntu 14 с Java 7. – trashgod

+2

OK. Кажется, это проблема с оболочкой GNOME. Когда я переключаюсь на Unity (по умолчанию в Ubuntu), он работает. Спасибо за помощь @trashgod – Harry

1

Я нашел временное решение своего рода, если вы измените следующую строку:

super(parent, title, true); 

к

super(null, title, Dialog.ModalityType.MODELESS); 

затем появится кнопка окно закрыть при использовании GNOME. Однако я не знаю, какие другие проблемы могут возникнуть.

+0

Я удивлен, что компилируется. Я получаю ошибку «неоднозначного конструктора», поскольку есть несколько конструкторов, которые соответствуют этой сигнатуре. Я нашел способ обойти это: 'super (null, title, Dialog.ModalityType.MODELESS);' – Harry

+1

Неплохо, я сам использовал Dialog.ModalityType.MODELESS. Я скопировал код из вашего первоначального примера и забыл изменить последний параметр. – Fooble