2011-09-29 88 views
3

我有一個JLabel,它在我的GUI中的特定位置包含可變文本。問題在於文本顯示在JLabel所在空間的底部。這不會向最終用戶傳達關於GUI其他內容的相關信息。相反,我需要將JLabel的文本打印在JLabel的垂直軸的中間。下面是我的代碼的簡化版本。任何人都可以告訴我如何改變它,使文本顯示在垂直軸的中間而不是底部?垂直軸中間的Java 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()); 
} 
} 
+0

爲了更快得到更好的幫助,請移除[SSCCE](http://pscode.org/sscce.html)。 –

回答

6

硬編碼的隨機首選大小是不是一個好主意。

您編寫了一個自定義用戶界面,因此UI的責任是將文本繪製在適當的位置。

您可以使用Text Icon方法來顯示垂直文本,而不是創建自定義用戶界面。創建標籤如下:

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

標籤添加到使用的BorderLayout和vetical文本將被垂直地和水平中心的面板的中心。

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); 
    } 
}