2011-07-08 81 views
2

我想創建一個快速和骯髒的擺動用戶界面。我的UI有幾個JTextField,然後是JScrollPane中的JTextArea,因爲JTextArea的內容可能會變大。我該如何改進JLabels的渲染?

我正在使用一個簡單的BoxLayout,我不想浪費幾個小時的GridBagLayout。

我的問題是,當我調整窗口大小時,JLabels變得很大。他們將有一行文本坐在巨大的空間裏。它看起來很醜並且很浪費。另一方面,JTextArea不會增加大小,因爲JScrollPane負責處理額外的內容。因此,我將在滾動窗格中顯示巨大的JTextFields和一個微小的JTextArea,並且幾乎看不到一行。

是否有一種簡單的方法可以確保JTextFields不會增加超過一行文本的高度?也許重寫getMaximumSize/getPreferredSize?如果是這樣,代碼是什麼?

解決這種情況的唯一功能是JFrame.pack(),但它會改變窗口大小(非常不可取),有時並不打擾自己侷限於桌面。

+0

「我試圖創建一個快速和骯髒的擺動用戶界面」...是否有任何其他類型的擺動用戶界面? :) –

+0

那麼有那麼慢,肥胖,滿身是汗,仍然髒GridBagLayout :)。 請注意,如果我正在用Java編寫一個嚴肅的應用程序,應該使用哪個UI? –

+0

坦率地說,自從1.4以來,擺動已經提高了很多,特別是在1.5和1.6。如果您正在開發桌面應用程序,那麼您沒有太多選擇。其他的java選項是SWT和QT。我自己並沒有使用QT,但SWT非常好,但是你不會發現SWT開發者可能會長期維護你的代碼。 –

回答

2
label.setMaximumSize(label.getPreferredSize()); 

或者更好的是,重寫getMaximumSize()方法返回首選大小。

實際上,我將這個建議反饋回來,因爲標籤的最大尺寸是首選尺寸。但是,這是一種可以與其他組件一起工作的技術,例如使用BoxLayout時的JTextField。

發佈您的SSCCE,證明問題。

編輯:

其實我覺得這個問題是BoxLayout的嘗試會增加所有部件的高度時,有額外的空間。要解決此問題,您需要使用:

panel.add(Box.createVerticalGlue()); 

作爲防止額外空間分配給組件的最後一個組件。

+0

在下面回答。 –

+0

@Sid Datia,你下面的意思是什麼?我在回覆中給出了答案。事實上,你的問題是關於標籤(而不是文本字段),所以我甚至猜測你沒有提出正確的問題。既然你沒有發佈代碼,我給了幾個建議。其中一個工作。 – camickr

+0

糟糕,我的主題標題不正確,對此很抱歉。問題出在JTextFields上。我想在評論中發佈代碼等,但那並不奏效。所以我用我寫的代碼發佈了一個答案。答案在你的答案下面。我希望你能回顧一下我所做的並對它做出評論。 –

0

createVerticalGlue()不做任何O_O。也許我做錯了。

覆蓋最大尺寸的效果非常好。爲什麼不默認Java?

public class TextFTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     JFrame jf = new JFrame(); 

     class X extends JTextField { 

      public X(String text) { 
       super(text); 
      } 

      @Override 
      public Dimension getMaximumSize() { 
       return new Dimension(super.getMaximumSize().width, 
            getPreferredSize().height); 
      } 

     } 

     jf.getContentPane().setLayout(
       new BoxLayout(jf.getContentPane(), BoxLayout.Y_AXIS)); 

     X f = new X("Hello"); 
     jf.getContentPane().add(f); 

     JTextField f1 = new JTextField("Hello1"); 
     jf.getContentPane().add(f1); 

     jf.getContentPane().add(Box.createVerticalGlue()); 

     jf.validate(); 

     jf.setSize(300, 300); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setVisible(true); 
    } 

} 

請原諒我可怕的編碼標準。