Java JLabel文本位于垂直轴的中间

时间:2011-09-29 20:16:02

标签: java swing vertical-alignment jlabel

我的JLabel包含GUI中某个位置的变量文本。问题是文本显示在JLabel所在空间的底部。这不会向最终用户传达关于GUI的其他内容的相关信息。相反,我需要JLabel的文本打印在JLabel的垂直轴的中间。我的代码的简化版本如下。任何人都可以告诉我如何改变它,使文本显示在垂直轴的中间而不是底部?

Main.java:

import java.awt.*;
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Main");      
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(new VerticalLabel("Hello"));
        Dimension prefSize = new Dimension(400, 300);
        frame.setPreferredSize(prefSize);
        frame.setMinimumSize(prefSize);
        frame.pack();
        frame.setVisible(true);
    }
}

VerticalLabel.java:

import javax.swing.*;
import java.awt.*;
import javax.swing.border.EtchedBorder;

public class VerticalLabel extends JLabel {
    public VerticalLabel(String labelText) {
        Dimension myDim = new Dimension(15, 250);
        this.setPreferredSize(myDim);
        this.setHorizontalAlignment(LEFT);
        this.setVerticalAlignment(CENTER);
        this.setText(labelText);
        this.setVerticalTextPosition(CENTER);
        this.setUI(new VerticalLabelUI(false));
        this.setBorder(new EtchedBorder());
    }
}

2 个答案:

答案 0 :(得分:6)

硬编码随机首选大小并不是一个好主意。

您编写了自定义UI,因此UI负责将文本绘制在正确的位置。

您可以使用Text Icon方法显示垂直文字,而不是创建自定义用户界面。创建标签如下:

JLabel label = new JLabel();
label.setHorizontalAlignment(JLabel.CENTER);
TextIcon labelIcon = new TextIcon(label, "Hello", TextIcon.Layout.VERTICAL);
label.setIcon( vIcon );

使用BorderLayout将标签添加到面板的CENTER中,并且垂直文本将垂直和水平居中。

答案 1 :(得分:5)

VerticalLabel

import javax.swing.*;
import java.awt.*;
import javax.swing.border.EtchedBorder;

public class VerticalLabel extends JLabel{

    public VerticalLabel(String labelText){ 
        this.setHorizontalAlignment(LEFT);
        this.setVerticalAlignment(CENTER);
        this.setText(labelText);
        this.setVerticalTextPosition(CENTER);
        //this.setUI( new VerticalLabelUI(false) );
        this.setBorder( new EtchedBorder() );
    }

    public static void main(String[] args){
        // should be done on the EDT.
        JFrame frame = new JFrame("Main");
        frame.getContentPane().setLayout( new GridBagLayout() );
        frame.getContentPane().add(new VerticalLabel("Hello"));
        Dimension prefSize = new Dimension(200,150);
        frame.setPreferredSize(prefSize);
        frame.setMinimumSize(prefSize);
        frame.pack();
        frame.setVisible(true);
    }
}