package data;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JFrame implements Runnable {
private JPanel contentPane;
private JPanel pp = new JPanel();
Thread page = new Thread();
public void run() {
while (!Thread.interrupted()) {
}
}
public Main() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 640 + 16, 480 + 39);
contentPane = new JPanel();
contentPane.setBounds(0, 0, 640, 480);
contentPane.setLayout(null);
setContentPane(contentPane);
pp.setBounds(0, 0, 640, 480);
pp.setBackground(Color.BLACK);
contentPane.add(pp);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
frame.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
上面的代码可以工作,但是setResizable会引起问题:http://i.stack.imgur.com/hQxPU.png
如果要删除setResizable,则底部和右侧的灰色将变成黑色,这是本应如此的。如何禁用大小调整而不会导致此问题?
最佳答案
您使用的是绝对布局(未设置LayoutManager
),并且黑色面板具有固定的边界。这正是调整父面板大小时黑色面板不会填充其父面板边界的原因。
解决方案:使用LayoutManager
会自动重新计算内容的范围,以填充可用空间。
// BorderLayout is your friend
contentPane.setLayout(new BorderLayout());
...
// delete this line, no need to set fixed bounds
// pp.setBounds(0, 0, 640, 480);
有关如何在AWT / Swing中使用布局管理器的更多信息:
The Java™ Tutorials - Using Layout Managers
布局管理器有两个目的:
计算容器的最小/最大/首选尺寸
通过在容器内设置其边界来布局组件。
如果希望黑色面板的大小为640x480,并且窗口不可调整大小,则可以设置首选大小,然后打包该窗口,以使其大小适合内容的首选大小:
pp.setPreferredSize(new Dimension(640, 480));
...
pack();