2013-01-17 63 views
1

我一直在玩WindowBuilder Pro Java Swing佈局,並遇到一些奇怪的行爲,我最終能夠減少到SSCCE。考慮下面的代碼:這個Swing行爲是一個錯誤嗎?神祕的BoxLayout對齊

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class WBPTest2 { 
    private JFrame frame; 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        WBPTest2 window = new WBPTest2(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
    public WBPTest2() { 
     initialize(); 
    } 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.RED); 
     frame.getContentPane().add(panel, BorderLayout.CENTER); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     JPanel panel_1 = new JPanel(); 
     panel_1.setBackground(Color.GREEN); 
     panel_1.setMaximumSize(new Dimension(32767, 100)); 
     panel.add(panel_1); 
     panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS)); 

     JPanel panel_2 = new JPanel(); 
     panel_2.setBackground(Color.BLUE); 
     panel_2.setMaximumSize(new Dimension(32767, 100)); 
     panel.add(panel_2); 
     panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); 
    } 
} 

它提供了以下佈局:

enter image description here

無論出於何種原因,panel_1,綠色的,浮動的權利。與一些代碼的參數打,我只能找到兩種方式來徹底殺滅差距綠色面板的左側:

  • 變化在panel_2構造的hgapvgap爲0

OR

  • 變化panel_2minimumSize到(0,0)。

做這類原因,我們得到這樣的:

enter image description here

現在的問題是,爲什麼在地球上無論是minimumSizehgappanel_2FlowLayout有什麼關係防止panel_1一直填充到其父項的左側?如果我碰巧想要minimumSize大於零以及hgap大於零,那麼我的FlowLayoutpanel_2?那麼如何消除panel_1BoxLayout左側的缺口?

無論什麼我做panel_1,我不能讓它充滿其父容器的整個寬度(除非我編輯panel_2如上所述)。具有諷刺意味的是,如果我將alignmentX設置爲panel_1RIGHT_ALIGNMENT,它實際上會浮到左側。但差距仍然存在(剛纔在右邊)。當我填充panel_1內容並增加其大小時,其右側的差距越來越小,但從未完全消失,令人沮喪。

這時候panel_2FlowLayout並不僅僅發生......也恰好與JScrollPane和許多其他類型...類型的通常不具備hgap參數,這意味着要彌補這個不足的唯一途徑在panel_1的左邊是將新容器的minimumSize更改爲0,這又似乎很愚蠢和無關,最重要的可能不是我的設計意圖。

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 *「我最終能夠減少到SSCCE。」*嗯......好。你最終會分享這個SSCCE嗎? –

+0

@AndrewThompson對不起,猜我誤解了SSCCE,認爲主要方法就夠了。這裏是現在附加的完整源代碼。謝謝。 – The111

+0

@AndrewThompson你是什麼意思'null'佈局? [Oracle教程](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html#border)說:「每個內容窗格初始化爲使用BorderLayout。」所以我相信我的「框架」佈局不是空的?只是爲了咧嘴笑,我嘗試着通過構造函數明確地將其更改爲'BorderLayout',並且它仍然運行相同。另外,我不確定我是否理解你用'BufferedImage'提出的建議,抱歉。 – The111

回答

3

在面板1和2上設置alignmentX並填充屏幕。

看來兩個不同的佈局管理器會導致面板設置不同的對齊默認值。