2015-04-15 3 views
0

Так что у меня возникла проблема с созданием моего JDialog. Я знаю, что это не новый вопрос, но я все еще не могу понять концепцию EDT, Concurrency в Swing. Я надеюсь, кто-то может объяснить это простым способом (или указать мне на какой-то хорошо объясненный ресурс), как это работает и как именно я включаю это в свой код, чтобы сделать работу JDialog.JDialog появляется без какого-либо контента

Вот ресурс я читал о параллельности http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html

и вот мой код:

public class TestView { 

JFrame frame = new JFrame("Testing Radio Dialogs"); 
JPanel mainPanel = new JPanel(); 
JButton button = new JButton("Click me"); 
String[] folderNames = { "Java", "Ruby", "C++", "HTML" }; 

JRadioButton r11 = new JRadioButton(folderNames[0]); 
JRadioButton r22 = new JRadioButton(folderNames[1]); 
JRadioButton r33 = new JRadioButton(folderNames[2]); 
JRadioButton r44 = new JRadioButton(folderNames[3]); 

public TestView() { 

    frame.add(mainPanel); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    frame.setSize(400, 400); 
    mainPanel.setLayout(new GridLayout(0, 1)); 
    mainPanel.add(button); 
    button.addActionListener(new ButtonListener()); 
    mainPanel.add(r11); 
    mainPanel.add(r22); 
    mainPanel.add(r33); 
    mainPanel.add(r44); 

} 

class ButtonListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent ev) { 
     if (ev.getSource() == button) { 

      createPopup(); 

      System.out.println("Button clicked!"); 

     } 

    } 

} 

public void createPopup() { 

    JDialog dialog = new JDialog(); 
    JPanel dialogPanel = new JPanel(new GridLayout(0,1)); 
    dialogPanel.setSize(150, 150);  
    JRadioButton r1 = new JRadioButton("Ruby"); 
    JRadioButton r2 = new JRadioButton("Java"); 
    JRadioButton r3 = new JRadioButton("C++"); 
    JRadioButton r4 = new JRadioButton("HTML"); 
    ButtonGroup group = new ButtonGroup(); 
    group.add(r1); 
    group.add(r2); 
    group.add(r3); 
    group.add(r4); 
    dialogPanel.add(r1); 
    dialogPanel.add(r2); 
    dialogPanel.add(r3); 
    dialogPanel.add(r4); 
    dialog.setVisible(true); 
    System.out.println("Popup created!"); 

} 
} 

Я просмотрел подобные вопросы на различных форумах, но я до сих пор не совсем схватив понятие. Я был бы признателен за любые отзывы об этом и мой код.

+0

В чем проблема? Он работает на моем Mac PC. – Crazyjavahacking

+0

JDialog появляется, но без содержимого (JRadioButtons) и с минимальным размером окна. Im на ПК. – Lotix

ответ

3

Нет проблем с параллелизмом или потоком отправки, вы просто забыли добавить dialogPanel в dialog.

public void createPopup() { 
    //... 
    dialog.add(dialogPanel); 
    dialog.pack(); 
    dialog.setVisible(); 
    //... 
} 
+0

Спасибо, это действительно было проблемой. Тем не менее, всплывающее окно по-прежнему почти сведено к минимуму, несмотря на установку размера dialogPanel. Я попытался установить размер диалогового окна (который я должен сделать для начала), но я получаю тот же результат. Возможно, вы знаете причину этой проблемы? EDIT: Исправлено благодаря комментарию @camickr. – Lotix

+0

'dialog.pack()' в примере кода в моем ответе исправил это. Вы должны добавить только одну из двух новых строк. :) –

1

Примечание. Когда вы создаете свой кадр, вы добавляете компоненты в mainPanel ПОСЛЕ того, как рамка видна. По умолчанию все компоненты имеют нулевой размер, поэтому рисовать нечего. Я был бы удивлен, если ваш код работает.

Порядок код должен быть:

panel.add(...); 
panel.add(...); 
frame.add(panel); 
frame.pack(); 
frame.setVisible(); 

Все компоненты должны быть добавлены к панели, прежде чем сделать кадр видимым. Pack() вызовет диспетчер компоновки, который отвечает за определение размера/расположения компонентов на панели.

Значение setVisible (true) должно быть последним.

+0

Это фиксировало все проблемы, касающиеся размера моего окна. Большое спасибо за понимание. – Lotix

+1

Размер компонента по умолчанию не равен нулю; это зависит от менеджера компоновки, пользовательского интерфейса компонента, явных настроек и т. д. Все еще добавление статических компонентов до 'setVisible (true)' - правильный путь. Просто, чтобы быть ясным, но, * * возможно добавить компоненты после того, как контейнер будет виден, пока вы проверяете. См. Документы java.awt.Container # addImpl(). –

+0

Я должен уточнить размер компонента по умолчанию. Несмотря на то, что размер по умолчанию * по умолчанию компонента * равен нулю, * предпочтительный размер *, используемый большинством менеджеров компоновки, отсутствует. Таким образом, было бы что-то красить для менеджеров макетов, которые уважают предпочтительный размер. –