我有两个Swing组件: JDialog - >的JPanel
我想用JPanel填充JDialog中的所有空格。默认设置正常。 我可以更改对话框的大小,并正确更改JPanel的大小。
但是当我点击"最大化"图标然后内部JPanel冻结,直到窗口将最大化。
OS X版本10;
Java版本1.7。
代码示例:
final JDialog dialog = new JDialog(mainFrame, true);
dialog.setSize(new Dimension(800, 600));
dialog.setLocationRelativeTo(null);
final JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 14));
dialog.add(panel);
dialog.show();
是否存在修复此行为的方法?
答案 0 :(得分:1)
调整对话框大小或最大化时,以下完整示例不会冻结。以下是一些需要注意的事项:
JPanel
的默认布局为FlowLayout
;为了比较,我将框架的布局设置为相同。
调用pack()
“使Window
的大小适合其子组件的首选大小和布局。”由于该对话框仅包含空Jpanel
,因此我已覆盖getPreferredSize()
以显示效果。
应在event dispatch thread上仅构建和操作Swing GUI对象。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* @see https://stackoverflow.com/a/22450263/230513
*/
public class Test {
private void display() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.add(new JLabel("Frame"));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
JDialog dialog = new JDialog(frame, true);
final JPanel panel = new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
};
panel.add(new JLabel("Dialog"));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 14));
dialog.add(panel);
dialog.pack();
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Test().display();
}
});
}
}