Java-设置装饰JFrame的大小
我对JFrame的大小有问题: 我想在Jframe中显示内容。内容大小为640 x 480。但是我不能使用方法Java-设置装饰JFrame的大小,java,swing,jframe,size,window-decoration,Java,Swing,Jframe,Size,Window Decoration,我对JFrame的大小有问题: 我想在Jframe中显示内容。内容大小为640 x 480。但是我不能使用方法JFrame.setSize(640480)
JFrame.setSize(640480)因为我还想展示窗户的装饰。
我的第一个想法是:添加一个具有首选尺寸的面板,然后使用pack();。但这也不起作用-我只有一个非常小的窗口
我认为我的问题的解决方案可能类似于:
这是我的密码:
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Fenster extends JFrame {
JPanel panel;
Dimension dim;
Fenster(){
dim = new Dimension(640, 480);
panel = new JPanel();
panel.setSize(dim);
panel.setMinimumSize(dim);
panel.setMaximumSize(dim);
panel.setPreferredSize(dim);
panel.setBounds(0, 0, 640, 480);
panel.setDoubleBuffered(true);
JLabel label = new JLabel("bla");
panel.add(label);
this.setLayout(null);
this.getContentPane().add(panel);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
}
this.setLayout(null)代码>是您的问题。让布局管理器完成它的工作
从
public void pack()
使此窗口的大小适合
首选尺寸及其子组件的布局。结果宽度
如果出现以下情况之一,则自动放大窗口的高度:
尺寸小于上一节规定的最小尺寸
调用setMinimumSize方法。
如果窗口和/或其
所有者还不能显示,它们都可以显示
在计算首选尺寸之前。之后,将验证该窗口
它的大小正在计算中
大多数容器(JComponent
,JPanel
)具有默认的首选大小0x0
,布局管理器根据布局管理器本身的要求和容器的内容提供此信息,但使用null
,可以有效地使容器0x0
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
add(new JLabel("Look ma, no null layouts!"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
}
}
避免使用null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题
有关更多详细信息,请参见…this.setLayout(null)代码>是您的问题。让布局管理器来做它的工作。前面你强调的问题不是完全相同的问题,或者至少接受的解决方案是不正确的……”我的第一个想法是:添加一个具有首选维度的面板,然后使用pack();。“你的第一个想法是正确的(在最佳实践中是正确的,可以让它发挥作用)。我会坚持找出失败的原因。