所以我出现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!");
}
}
我在不同的论坛上浏览了类似的问题,但我仍然没有完全理解这个概念。我很欣赏有关此事和我的代码的任何反馈。
答案 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)应该是最后一个语句。