2011-05-16 43 views
4

我有同樣的事情,因爲這傢伙的麻煩missbehave:換行,導致JScrollPane的與MiGLayout

MigLayout JTextArea is not shrinking when used with linewrap=true

和我以前的答案中的一個描述的解決方案;明確設置最小尺寸。如果將包含JTextArea的JPanel直接放在JFrame中,然後調整窗口大小,這可以很好地工作。

但是,如果將包含JTextArea的面板放置在JScrollPane中,則 會再次出現相同的問題。爲什麼是這樣,以及如何解決它?

乾杯

編輯:一個例子

public class MiGTest2 extends JFrame{ 
public MiGTest2(){ 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]")); 
    JTextArea textArea = new JTextArea(); 
    textArea.setLineWrap(true); 
    panel.add(textArea, "wmin 10"); 
    //panel.add(new JTextField()); 
    JScrollPane scrollPane = new JScrollPane(panel); 
    //add(panel); 
    add(scrollPane); 
    pack(); 
} 
public static void main(String[] args){ 
    new MiGTest2().setVisible(true); 
} 
} 

如果取消註釋//add(panel);和評論add(scrollPane);,縮小窗口的大小也將縮小的JTextArea。也就是說,它不適用於JScrollPane。另請注意,佈局管理器在第一次放大後如何翻轉並開始「搖動」其所有內容時,縮小窗口大小

+0

嗯不是這樣(由克列奧帕特拉).. http://forums.oracle.com/forums/thread.jspa?threadID=2211458&start=16&tstart= 0 – mKorbel 2011-05-16 22:21:12

+0

@mrKorbel對不起,但我不確定你在這裏指的是什麼? – Datoraki 2011-05-16 22:46:06

回答

7

我有一個非常類似的問題,在提到question答案也幫不了我以下。然而,它確實提供了一個有價值的想法 - 問題在於啓用了wrap的JTextArea的寬度。

對我而言,使用命令width在組件級別設置了最小和首選寬度。例如,width 10:500:

+0

這實際上是答案的核心 - 讓MigLayout管理大小 - 扭曲,所有JTextAreas都需要在框架上考慮。我遇到了一個沒有考慮到的案例(很難說,因爲它本質上是一個標籤),這導致面板上的所有JTextAreas失敗。 – Yishai 2011-11-15 22:44:36

+0

完美工作。謝謝! – Datoraki 2011-12-19 12:23:01

0

通常情況下,您需要將JTextArea放入JScrollPane中。就像這樣:

JTextArea area = new JTextArea(); 
JScrollPane scroll = new JScrollPane(area); 
JPanel panel = new JPanel(); 
panel.add(scroll); 
+2

這裏描述了JPanels定義的所有可能的構造器http://download.oracle.com/javase/6/docs/api/javax/swing/JPanel.html#JPanel%28java.awt.LayoutManager,%20boolean%29 – mKorbel 2011-05-16 21:36:51

+0

拋開構造函數,這不適用於上面的例子。或者,也許你可以編輯上面的例子,所以它的作品?我到目前爲止還沒有找到一個可以工作的單一組合 – Datoraki 2011-05-16 22:17:35

+1

@mKorbel該死的,我快速發送它。更正了這一點,對不起。 – 2011-05-17 06:18:20

0

不是很確定你想在這裏實現什麼,試試看看它是否適合你的需求?

 

public class MiGTest2 extends JFrame { 
    public MiGTest2() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]")); 

     JTextArea textArea = new JTextArea(); 
     textArea.setLineWrap(true); 
     panel.add(new JScrollPane(textArea), "wmin 10, grow, push"); 

     setLayout(new MigLayout("fill")); 

     JScrollPane scrollPane = new JScrollPane(panel); 
     add(scrollPane, "grow, push"); 

     pack(); 
    } 

    public static void main(String[] args) { 
     new MiGTest2().setVisible(true); 
    } 
} 
 
6

我在使用JScrollPanes時遇到了與JTextAreas類似的問題和包裝問題。

對我而言,一個解決方案是創建一個實現Scrollable接口並覆蓋getScrollableTracksViewportWidth()方法返回true的自定義面板。這種強制導致滾動窗格只能垂直滾動,並讓行包裝在JTextArea中按預期工作。

/** 
* A panel that, when placed in a {@link JScrollPane}, only scrolls vertically and resizes horizontally as needed. 
*/ 
public class OnlyVerticalScrollPanel extends JPanel implements Scrollable 
{ 
    public OnlyVerticalScrollPanel() 
    { 
     this(new GridLayout(0, 1)); 
    } 

    public OnlyVerticalScrollPanel(LayoutManager lm) 
    { 
     super(lm); 
    } 

    public OnlyVerticalScrollPanel(Component comp) 
    { 
     this(); 
     add(comp); 
    } 

    @Override 
    public Dimension getPreferredScrollableViewportSize() 
    { 
     return(getPreferredSize()); 
    } 

    @Override 
    public int getScrollableUnitIncrement(Rectangle visibleRect, 
      int orientation, int direction) 
    { 
     return(10); 
    } 

    @Override 
    public int getScrollableBlockIncrement(Rectangle visibleRect, 
      int orientation, int direction) 
    { 
     return(100); 
    } 

    @Override 
    public boolean getScrollableTracksViewportWidth() 
    { 
     return(true); 
    } 

    @Override 
    public boolean getScrollableTracksViewportHeight() 
    { 
     return(false); 
    } 
} 

和MigTest2變爲:

public class MiGTest2 extends JFrame 
{ 
    public MiGTest2() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]")); 
     JTextArea textArea = new JTextArea(); 
     textArea.setLineWrap(true); 
     panel.add(textArea, "wmin 10"); 
     //panel.add(new JTextField()); 

     //Wrap panel with the OnlyVerticalScrollPane to prevent horizontal scrolling 
     JScrollPane scrollPane = new JScrollPane(new OnlyVerticalScrollPanel(panel)); 
     //add(panel); 
     add(scrollPane); 
     pack(); 
    } 

    public static void main(String[] args) 
    { 
     new MiGTest2().setVisible(true); 
    } 
} 
+0

謝謝prunge,但這真的不起作用。我在面板內部得到一個JTextArea(所以它只限於一行),當框架變小時它不會收縮,它只是在一個可以獲得水平滾動條的面板中。 – Yishai 2011-11-15 15:04:36

+0

您需要將wmin設置爲約束或它不起作用。我剛剛使用這個,工作正常。 – 2011-11-16 17:24:55