我有一个从 JPanel
派生的面板。我有一个从 JLabel
派生的自定义控件。我正在尝试将这个自定义 JLabel
放在我的面板上。
我知道的唯一可行的方法是使用空布局 (setLayout(null)
),然后计算自定义 JLabel 的 setLocation()
指向正确的位置。
自定义 JLabel
在此应用程序中从一个面板物理移动到此面板,我相信之前在 setLocation
中设置的位置会影响事物。但是,当我将其设置为 (0,0) 时,组件会上升到左上角。
BorderLayout
不起作用,因为当仅提供 1 个组件并将其放入 BorderLayout.CENTER
时,中心部分会扩展以填充所有空间。
我从另一个站点剪切和粘贴的示例使用了 BoxLayout
和 component.setAlignmentX(Component.CENTER_ALIGNMENT)
。这也不起作用。
另一个答案提到覆盖面板的 getInset()
函数(我认为这就是它的名称),但事实证明这是一个死胡同。
到目前为止,我正在使用具有 GridBagLayout
布局的面板,并且在将自定义 JLabel
插入时包含了一个 GridBagConstraints
对象我的面板。但是,这是低效的。有没有更好的方法让 JLabel
在我的 JPanel
中居中?
最佳答案
设置 GridBagLayout对于 JPanel , 把 JLabel没有任何GridBagConstraints到JPanel , JLabel将居中
例子
import java.awt.*;
import javax.swing.*;
public class CenteredJLabel {
private JFrame frame = new JFrame("Test");
private JPanel panel = new JPanel();
private JLabel label = new JLabel("CenteredJLabel");
public CenteredJLabel() {
panel.setLayout(new GridBagLayout());
panel.add(label);
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(panel);
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
CenteredJLabel centeredJLabel = new CenteredJLabel();
}
});
}
}
关于java - 在 JPanel 中将 JLabel 居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9829319/