Java 在OSX上调整JPanel的大小
我有两个Swing组件: JDialog->JPanel 我想用JPanel填充JDialog中的所有空间。默认设置可以正常工作。 我可以更改对话框的大小,并且JPanel的大小已正确更改 但当我点击“最大化”图标时,内部JPanel被冻结,直到窗口被最大化 OSX版本10Java 在OSX上调整JPanel的大小,java,swing,jdialog,Java,Swing,Jdialog,我有两个Swing组件: JDialog->JPanel 我想用JPanel填充JDialog中的所有空间。默认设置可以正常工作。 我可以更改对话框的大小,并且JPanel的大小已正确更改 但当我点击“最大化”图标时,内部JPanel被冻结,直到窗口被最大化 OSX版本10 Java版本1.7 代码示例: final JDialog dialog = new JDialog(mainFrame, true); dialog.setSize(new Dimension(800, 600)); di
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();
是否存在修复此行为的方法?以下完整示例在调整对话框大小或最大化对话框时不会冻结。以下是需要注意的几点:
的默认布局为;为了比较,我将框架的布局设置为相同JPanel
- 调用
“会使此pack()
窗口的大小符合其子组件的首选大小和布局。”由于该对话框仅包含一个空
,因此我已覆盖以显示效果Jpanel
- Swing GUI对象应仅在上构造和操作
无关:
dialog.show()
,应该是dialog.setVisible(true)
解决方案不起作用。这似乎是OSX特定的Java热点错误。@Andrew:它在Java 8下对我有效;还考虑了所看到的增强。
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();
}
});
}
}