我是Java的新手,我正在尝试编写我的第一个程序..
但是我已经遇到了第一个问题,我似乎无法在谷歌找到答案。
我在其中制作了一个JFrame和一个JPanel。
我希望面板具有特定的尺寸,但是当我尝试设置面板的尺寸时,它不起作用,并且面板恰好适合框架的大小。
package proj;
import javax.swing.*;
import java.awt.*;
class Program {
Program() {
JFrame frame = new JFrame("Mit program");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(600, 400);
frame.setResizable(false);
JPanel panel = new JPanel();
panel.setVisible(true);
panel.setSize(100,100); // <- Why doesn't this work?
panel.setBorder(BorderFactory.createLineBorder(Color.black));
frame.add(panel);
}
}
public class Proj {
public static void main(String[] args) {
new Program();
}
}
答案 0 :(得分:1)
切勿使用panel.setSize(100,100);
代替panel.setPreferredSize(100,100);
setSize也应该在setVisible方法之后。
答案 1 :(得分:1)
不要像其他答案所暗示的那样担心设置尺寸甚至设置首选尺寸(除非您正在进行自定义绘画,在这种情况下,您要覆盖{{1而不是getPreferredSize()
)。
您应该使用布局管理器来为您调整大小和布局组件。当您向面板添加组件时,面板的首选大小将由您来处理。
同样在您当前的情况下,该框架具有默认setPreferredSize()
,其中不尊重首选尺寸,因此即使BorderLayout
也无法工作,因为你设置了框架的大小。
有关详细信息,请参阅Laying out Components within a Container。
另见Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?
另请查看this answer,快速了解哪些布局符合组件的首选尺寸以及哪些布局不会。
此外,通常情况下,您应该在添加所有组件后始终将框架设置为。
此外,swing应用程序应该在Event Dispatch Thread(EDT)上运行。详情请见Initial Threads
答案 2 :(得分:0)
您可以像这样设置首选尺寸
panel.setPreferredSize(new Dimension(100, 100));
frame.add(panel);
frame.pack();
这是因为大多数时候大小都是由布局管理器决定的。还要添加包功能。
理想情况下,您应该使用布局管理器来实现此目的。 http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html#sizealignment