2015-01-07 111 views
2

如果我將JLabel放在JPanel的內部,但沒有嚴格的邊界,當JPanel的大小小於文本大小時,它不會截斷文本。爲什麼會發生? JPanel不應該認識到沒有足夠的空間&相應地截斷文本,不管它的佈局如何?JLabel在JPanel中不截斷

作爲一個例子,我創建了一個JFrameGridLayout與兩行&一列。在那裏,我放置了一個JPanel頂部的FlowLayout,& a JPanel底部的BoxLayout。每個JPanel包含一個JLabel

總之:爲什麼頂部的JLabel截斷它的文本?

圖片展示了我的意思: enter image description here enter image description here

而且,這是展示效果SSCCE:

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

public class TruncationTest1 
{ 
    public static void main(String[] args) 
    { 
     JFrame f = new JFrame("Truncation Test"); 
     JPanel panel = new JPanel(); //Default layout, aka FlowLayout 
     JLabel label = new JLabel("Try resizing the frame: This will not be truncated for some reason."); 
     JLabel label2 = new JLabel("However, this JLabel, on the other hand, will become truncated."); 
     f.setLayout(new GridLayout(2,1)); 
     f.setBackground(Color.BLACK); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(panel); 
      panel.setBackground(Color.WHITE); 
      panel.add(label); 
     f.add(label2); 
      label2.setHorizontalAlignment(JLabel.CENTER); 
      label2.setForeground(Color.WHITE); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

1)有關Swing中正確線程處理的更多詳細信息,請參見[Swing併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。特別是關於初始線程的部分。 2)在'f.setVisible(true);' –

回答

3

FlowLayout不調整其內部組件。它顯示具有首選大小的組件。

您需要使用不同的佈局來代替FlowLayout才能正確調整大小。例如,您可以使用BorderLayout,標籤號爲LINE_STARTWEST

+0

*「之前調用'f.pack();',標籤爲'LINE_START'或'WEST'。*我更喜歡'LINE_START',因爲它是locale敏感。 –