【发布时间】:2019-05-26 12:25:08
【问题描述】:
我有一个扩展 Jframe 的类,我使用 setLocationRelativeTo(null); 将其居中。 layoutManager 也是null。
我的 JFrame:
mport com.sxf.protocol.chat.util.window.AbstractField;
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
public class Field extends AbstractField {
private Container cp;
public Field() {
super("Test");
buildWindow();
}
private void buildWindow() {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setPreferredSize(new Dimension(frameWidth, frameHeight));
setResizable(false);
cp = getContentPane();
cp.setLayout(null);
initComponents();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void initComponents() {
JLabel label = new JLabel("Test", SwingConstants.CENTER);
JLabel border = new JLabel("");
label.setSize(200, 30);
label.setLocation((frameWidth - label.getWidth()) / 2, (frameHeight - label.getHeight()) / 2);
border.setBounds(frameWidth / 2, 0, frameWidth / 2, frameHeight);
label.setBorder(new LineBorder(new Color(0, 0, 0)));
border.setBorder(new LineBorder(new Color(255, 0, 0)));
cp.add(label);
cp.add(border);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Field();
}
});
}
}
我添加到边框以查看它是否正确居中。
AbstractField(里面只有一些计算):
public abstract class AbstractField extends JFrame {
private final static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
private static final Dimension frameSize = new Dimension(screenSize.width / 4, screenSize.height / 4);
protected static final int frameWidth;
protected static final int frameHeight;
protected static final int x;
protected static final int y;
static {
frameWidth = frameSize.width;
frameHeight = frameSize.height;
x = (screenSize.width - frameWidth) / 2;
y = (screenSize.height - frameHeight) / 2;
}
public AbstractField(String title) {
super(title);
}
}
但是当我尝试将组件居中时,例如JLabel,做(frame.getWidth - component.getWidth) / 2,高度也一样,它实际上不是居中而是向右一点。
这是由于 jframe 的原生移动开头,我可以计算吗?
【问题讨论】:
-
1)
AbstractField extends JFrame请给类起描述性、逻辑性和合理性的名称。例如,这个类可能是抽象的,但绝不是像JTextField这样的字段。AbstractFrame会更有意义。 2)private final static..使用static修饰符通常会隐藏更大的问题,同时也会产生自己的问题。删除static的所有实例并弄清楚如何使用字段的非静态实例。 3)..frameSize = new Dimension(screenSize.width / 4, screenSize.height / 4);这充其量只是猜测框架的大小。相反.. -
..
pack()确保它是显示内容所需的(最小)尺寸。 4)x = (screenSize.width - frameWidth) / 2;(a)x和y不仅已经为 mot 组件和窗口定义,而且它们还用于其他用途。给你的属性起不同的名字。 (b) 要在屏幕上居中显示窗口,请在添加所有组件后调用window.setLocationRelativeTo(null;)。 5) 不要无故延长框架。这是什么原因? 6)cp.setLayout(null);Java GUI 必须在不同的操作系统上工作,.. -
.. 屏幕尺寸、屏幕分辨率等在不同区域使用不同的 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 7)
label.setLocation((frameWidth - label.getWidth()) / 2, (frameHeight - label.getHeight()) / 2);这不考虑框架装饰或“镀铬”。这就是为什么我们通常会在添加到框架中的JPanel中重新定位所有内容。 -
8) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度 - 以显示额外的应该使用空间。 9)如需更好的帮助,请edit添加minimal reproducible example或Short, Self Contained, Correct Example。
-
这更像是一个小型私人项目,但我会尝试转换您的提示。
标签: java swing jframe window layout-manager