2014-03-31 32 views
0

我有以下代碼來創建我的GUI。BorderLayout.CENTER不居中我的JPanel

private static void createGUI() { 
    JFrame frame = new JFrame ("Tiles Game"); 
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 

    frame.setJMenuBar (new JMenuBar()); 
    frame.setContentPane (MainPanel.getInstance()); 

    frame.pack(); 
    frame.setResizable (false); 
    frame.setLocationRelativeTo (null); 
    frame.setVisible (true); 
} 

這是mainPanel中(擴展JPanel)構造函數:

private MainPanel() { 
    super (new BorderLayout()); 
    setPreferredSize (new Dimension (IMG_SIZE + 10, IMG_SIZE + 10)); 
    ... 
    panel = new ImagePanel(); 
    add (panel, BorderLayout.CENTER); 
} 

這是ImagePanel(擴展JPanel)構造函數:

private ImagePanel() { 
    super(); 
    setPreferredSize (new Dimension (IMG_SIZE, IMG_SIZE)); 
    ... 
} 

然而ImagePanel對齊頂端MainPanel的左上角而不是居中,所以我在底部和右側得到一堆額外的填充,而在頂部和左側沒有填充。我如何將它放置在MainPanel的中心?

+0

框架的內容窗格中。這可能是你的圖像。圖像有固定的大小,如果它被設置爲0,0座標,每次調整您的JFrame時它看起來像你的面板不居中。 –

+0

嘗試一些可見的邊框設置爲您的組件,如果你有對齊問題,你不知道它會導致例如,將其組件'this.setBorder(新EtchedBorder());'在'MainPanel'構造。然後你會看到初始化時需要的界限德,我看到佈局沒有問題 - 一定是別的什麼錯。 – hoefling

回答

2

可能發生的事情是,你是從哪個(0, 0)是左上角繪製圖像。然後,將首選大小設置爲10個像素,使面板更大,但圖像仍然爲(0, 0)

取而代之,使用相同的大小witoout添加10,並使用面板的EmptyBorder。另外,作爲一個建議,覆蓋getPreferredSize()而是採用setPreferredSize()

public class ImagePanel extends JPanel { 
    public ImagePanel() { 
     setBorder(new EmptyBorder(10, 10, 10, 10)); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(IMG_SIZE, IMG_SIZE); 
    } 
} 

您可能還需要考慮使用GridBagLayout的容器板,爲確保中心,如果容器是比子面板大。幾件事你可以做。即使考慮使用ImageIconJLabel而不是繪畫(如果圖像不需要被調整(如Camickr(+1)所指出的)。一個JLabel可以很容易地通過只需設置標籤的佈局進行背景並設置它作爲

ImageIcon icon = new ImageIcon(...) 
JLabel frameBackground = new JLabel(icon); 
frameBackground.setLayout(new BorderLayout()); 
frame.setContentPane(frameBackground); 
+0

所以問題是BorderLayout不尊重首選大小(甚至最大大小),只是調整ImagePanel的大小以適應MainPanel。使用GridBagLayout正確地居中我的ImagePanel。 –

2

不要使用一個JPanel來顯示圖像。

改用JLabelImageIcon

如果你想在圖像周圍多餘的空間,那麼你在標籤上使用EmptyBorder

+0

我無法使用ImageIcon,因爲我也在那裏進行圖像處理。在JPanel上使用JLabel有特別的理由嗎? –