JDialog没有任何内容出现

时间:2015-04-15 13:29:43

标签: java swing jdialog event-dispatch-thread

所以我出现JDialog时遇到了这个问题。我知道这不是一个新问题,但我仍然无法在Swing中完全掌握EDT,并发的概念。我希望有人能够以一种简单的方式解释这一点(或者指向一些解释良好的资源)这是如何工作的,以及我将如何将其包含在我的代码中以使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!");

}
}

我在不同的论坛上浏览了类似的问题,但我仍然没有完全理解这个概念。我很欣赏有关此事和我的代码的任何反馈。

2 个答案:

答案 0 :(得分:3)

并发或调度线程没有问题,您只是忘了将dialogPanel添加到dialog

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

答案 1 :(得分:1)

注意,在创建框架时,您可以在框架可见之后将组件添加到主面板。默认情况下,所有组件的大小都为零,因此无需绘制任何内容。如果您的代码有效,我会感到惊讶。

您的代码的顺序应为:

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

在使框架可见之前,应将所有组件添加到面板中。 pack()将调用布局管理器,该管理器负责确定面板上组件的大小/位置。

setVisible(true)应该是最后一个语句。