如何使-shm
文本与中心垂直和水平对齐?
我必须使用JLabel
和setHorizontalTextPosition
。可以通过使用这两个实现吗?
我已经尝试过,但是文字仍然停留在顶部。
setVerticalTextPosition
答案 0 :(得分:1)
我已经尝试过,但是文字仍然停留在顶部。
您有两个问题:
BorderLayout
。当您将组件添加到CENTER
时(这是您未指定约束时的默认设置),组件的大小将适合整个框架。然后,“对齐”属性将控制文本在分配给标签的尺寸内的位置。或者另一种选择是使用GridBagLayout
。然后,您无需使用组件的对齐选项:
setLayout( new GridBagLayout() );
add(label, new GridBagConstraints());
尝试这两个选项,因为两者可能在不同情况下都有效。
阅读Layout Managers上的Swing教程,以更好地了解每个布局管理器的工作原理。
答案 1 :(得分:-2)
很抱歉不知道为什么setHorizontalTextPosition方法和setVerticalTextPosition方法不起作用。
但是,我会让您知道,有几种方法可以通过在创建标签时插入与String对齐的参数来对标签中的文本进行排序。
首先,camickr的答案是最好的答案,因为Swing旨在与布局管理器一起使用!
请记住,最推荐的方法是由camickr将GridBagLayout()应用于JFrame的布局。
此答案旨在告知您 这种方法也是可行的,但在正常情况下不建议使用
不建议使用此方法,因为更改框架的大小 保持组件就位,但可能会给您一些帮助 当指示组件中的组件的大小和位置 容器的使用方式可以在特殊情况下使用,例如 当需要修复它们而没有外部影响时。
为了更好地了解问题,我将仅更改您上载给我的代码,以便可以执行该代码。
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Color;
public class StackOver extends JFrame
{
private JLabel label;
public StackOver() //constructor
{
super("Simple GUI");
setLayout(null);
setSize(500,300);
label=new JLabel("Centered JLabel", JLabel.CENTER);
/*
label.setHorizontalTextPosition(SwingConstants.CENTER);
label.setVerticalTextPosition(SwingConstants.CENTER);*/
add(label);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new StackOver();
}
}
嗯,让我们在JLabel的背景中添加一些颜色以了解更多信息。
label.setOpaque(true); //Transparency Settings
label.setBackground(Color.pink); //Specify background color
//to use 'Color' class, We must import java.awt.Color;
JFrame设置设置为FlowLayout()
,这使得组件的位置和大小是固定的,因此我们看不到它起作用!
所以现在我们将经历以下两个过程。 1)将JFrame的布局更改为null以使用绝对布局(“不推荐,只是一种情况”) 2)更改JLabel的大小和位置 进度完成后,我们可以看到文本对齐有效!
1)更改JFrame的布局
following link: Layout Manager表明FlowLayout之外的布局太多。
Swing旨在使用布局管理器,因此,您当然应该使用上面的“布局”链接之一。
但是,要使用一种有趣的方式来绝对固定组件的位置和大小,我们将切换到setLayout(null);
!
2)更改JLabel的大小和位置
我们可以使用setBounds(int startX, int startY, int Width, int Height)
方法直接更改JLabel的大小和位置!
import java.awt.FlowLayout;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Color;
public class StackOver extends JFrame
{
private JLabel label;
public StackOver() //constructor
{
super("Simple GUI");
setLayout(null);
setSize(500,300);
label=new JLabel("Centered JLabel", JLabel.CENTER);
// Since it also sets the size of the JLabel,
//let's use the constructor to set the alignment of the text inside the JLabel.
label.setOpaque(true); //Transparency Settings
label.setBackground(Color.pink); //Specify background color
//to use 'Color' class, We must import java.awt.Color;
Rectangle r = this.getBounds(); //to get Frame Size
label.setBounds(r.x+100, r.y+100, r.width-200, r.height-200);
/*
label.setHorizontalTextPosition(SwingConstants.CENTER);
label.setVerticalTextPosition(SwingConstants.CENTER);*/
add(label);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new StackOver();
}
}
现在我们可以按预期在中间看到JLabel的文本了!
此方法可以直接固定所有组件(例如按钮)的大小和位置,但是即使程序运行后JFrame的窗口大小发生变化,组件的位置和大小也是固定的。
因此,如果您确实希望通过这种方式完全设置组件,则宁愿通过在JFrame的代码上添加以下代码来将JFrame Resizable设置为false
this.setResizable(false);
我希望答案对您有所帮助,并度过一个愉快的一天!