2012-09-12 62 views
1

我有這樣的代碼加載5張圖片,並將它們放入用的FlowLayout框架:如何的FlowLayout絕對定位混合

public class Main 
{ 
    private static final int verticalGap=50; 
    private static final int horizontalGap=30; 
    private static final int width= 800; 
    private static final int height= 800; 
    public static void main(String[] args) 
    { 
     FlowLayout layout=new FlowLayout(FlowLayout.LEADING,horizontalGap,verticalGap); 
     JButton button= new JButton("Discard"); 
     ImagePanel[] panels= new ImagePanel[5]; 
     Deck deck= new Deck(); 
     JFrame frame= new JFrame("Poker"); 
     frame.setSize(width, height); 
     frame.setLayout(layout); 
     frame.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
     deck.mix(); 
     for(int i=0; i<5; i++) 
     { 
      panels[i]= new ImagePanel(); 
      panels[i].setImage(deck.getCard(i)); 
      frame.getContentPane().add(panels[i]); 
     } 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

的代碼加載5張卡,並正確辨認它們。
但問題是,現在我想把一個按鈕放到框架上。這個按鈕應該放置在屏幕的中央,但是如果我將它添加到窗格中,則按鈕將放置在其他面板附近,使用流佈局設置的水平間隙。
如何在不改變面板位置的情況下將其置於絕對位置(所以我希望使用流佈局添加5個面板,並且要在絕對位置添加一個按鈕)。

+0

這個按鈕的相關性在GUI的'正確位置'是什麼?它是否「自毀」?將它集中在BorderLayout的'PAGE_START'或'PAGE_END'中可能會更好。還要爲圖像考慮一個'JList'。 –

回答

3

您不能將絕對佈局與LayoutManager混合使用。

在這種情況下:

  1. 我想(用你的FlowLayout)包裹在一個單獨的JPanel中的5張牌。
  2. 我會將該面板放在內容窗格中。
  3. 並使用另一個JPanel作爲我將添加到內容窗格的南部(默認情況下內容窗格使用BorderLayout)的按鈕。在這個面板中,我將簡單地使用一個FlowLayout,並將對齊設置爲CENTER。
  4. 使用SwingUtilities.invokeLater移動你的GUI初始化代碼到EDT(總是在EDT運行GUI的東西!)

這裏是對應於解決方案的代碼(但因爲我不我無法測試它沒有你的其他班級)。

import java.awt.BorderLayout; 
import java.awt.ComponentOrientation; 
import java.awt.FlowLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Main { 
    private static final int verticalGap = 50; 
    private static final int horizontalGap = 30; 
    private static final int width = 800; 
    private static final int height = 800; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Main().initUI(); 
      } 
     }); 
    } 

    private void initUI() { 
     FlowLayout layout = new FlowLayout(FlowLayout.LEADING, horizontalGap, verticalGap); 
     JButton button = new JButton("Discard"); 
     ImagePanel[] panels = new ImagePanel[5]; 
     Deck deck = new Deck(); 
     JFrame frame = new JFrame("Poker"); 
     frame.setSize(width, height); 
     frame.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
     deck.mix(); 
     JPanel deckPanel = new JPanel(layout); 
     for (int i = 0; i < 5; i++) { 
      panels[i] = new ImagePanel(); 
      panels[i].setImage(deck.getCard(i)); 
      deckPanel.add(panels[i]); 
     } 
     frame.getContentPane().add(deckPanel); 
     JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     buttonPanel.add(button); 
     frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack();// Sets the frame size to its preferred size. 
     // You can also call setSize() instead 
     frame.setVisible(true); 
    } 
}