java - 如何在 JFrame 中真正居中对象?
问题描述
我有一个扩展 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 的原生移动开头,我可以计算吗?
解决方案
如何在 JFrame 中真正居中对象?
确实将其添加为添加到 a 的唯一JPanel
组件GridBagLayout
。将该面板用作内容窗格。
例子:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class CenteredLabel {
private JComponent ui = null;
CenteredLabel() {
initUI();
}
public final void initUI() {
if (ui!=null) return;
ui = new JPanel(new GridBagLayout());
ui.setBorder(new EmptyBorder(4,4,4,4));
JLabel centeredLabel = new JLabel("Test");
centeredLabel.setBorder(new LineBorder(Color.RED));
ui.add(centeredLabel);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = () -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
CenteredLabel o = new CenteredLabel();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
};
SwingUtilities.invokeLater(r);
}
}
推荐阅读
- javascript - 在 javascript 中用于什么以及如何使用“x % 2 == 0”?
- javascript - 重新加载后的项目以不同的顺序显示 Django
- linux - 如何在awk中为多个文件编写代码
- elasticsearch - 使用弹簧数据获取弹性搜索中某个字段的所有不同值
- javascript - 根据reactjs中的条件显示值
- c++ - 如何使用 Open MP 并行化 A* 算法?
- html - 有没有办法让 div 溢出对称?
- powershell - 使用参数运行 PowerShell 脚本
- ios - Ionic 应用程序使用 Ionic serve 加载,但不使用 Xcode
- python - 一旦 X 数量的推文存储在 CSV 中,如何停止 Tweepy?