2016-12-18 34 views
0

enter image description here當包含GridLayout時,我可以爲JFrame設置特定的邊框大小嗎?

這是一個示例類

import javax.swing.*; 
import java.awt.*; 

public class Image { 

public static void main(String[] args) { 

     JFrame f = new JFrame(); 
     Layout lo = new Layout(); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(new Dimension(500, 500)); 
     f.setLocationRelativeTo(null); 
     f.getContentPane().add(lo.getGUI(), BorderLayout.CENTER); 
     f.setVisible(true); 
     } 
} 

這是帶有它

import java.awt.*; 
import javax.swing.*; 

public class Layout { 

    private JPanel p; 

    public Layout() { 
     p = new JPanel(new GridLayout(5, 5, 1, 1)); 
     p.setBackground(Color.BLACK); 

     JLabel[][] lbs = new JLabel[5][5]; 

     for (int i = 0; i < 5; i++) 
      for (int j = 0; j < 5; j++) { 
       lbs[i][j] = new JLabel(".", JLabel.CENTER); 
       lbs[i][j].setBackground(Color.WHITE); 
       lbs[i][j].setOpaque(true); 
       p.add(lbs[i][j]); 
      } 
    } 

    public JComponent getGUI() { 
     return p; 
    } 
} 

結果代碼的佈局類是這樣的:

enter image description here

所以,我的問題是如何確定像上面的圖像一樣的尺寸?我稍後想在後面添加按鈕等組件。我無法弄清楚在應用GridLayout之後如何設置JPanel的固定大小。我添加了GridLayout,因爲我需要它顯示與國際象棋類似的東西。除了按鈕之外,我不會觸摸任何東西。 JPanel是爲了這個觀點。

我應該提到我會將網格中間的點改爲其他符號(如!或#)來表示5x5空間中的對象。我使用JLabel來呈現對象。如果我使用GridBagLayout,所有的符號都被壓扁在一個區域中。

回答

2

我不確定我100%明白你在問什麼,但是如果你的願望是圍繞網格空的空間,那麼你可能想要的是一個EmptyBorder,通過BorderFactor.createEmptyBorder(gap, gap, gap, gap);可以輕鬆獲得,是邊界的大小,當然可以是每邊的唯一值。

不要忘記嵌套JPanels,每個都使用自己的佈局,以獲得最大的佈局效果。例如,下面的GUI是由下面的代碼生成:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class LayoutTest extends JPanel { 
    private static final int CELL_WIDTH = 100; 
    private static final int SIDES = 5; 
    private static final int GAP = 25; 
    private static final Color BG = Color.WHITE; 
    private LayoutPanel layoutPanel = new LayoutPanel(CELL_WIDTH, SIDES); 

    public LayoutTest() { 
     setBackground(BG); 
     JPanel btnPanel = new JPanel(new GridLayout(1, 0, GAP, GAP)); 
     btnPanel.add(new JButton("Button 1")); 
     btnPanel.add(new JButton("Button 2")); 
     btnPanel.setBackground(BG); 

     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     setLayout(new BorderLayout(GAP, GAP)); 
     add(layoutPanel, BorderLayout.CENTER); 
     add(btnPanel, BorderLayout.PAGE_START); 
    } 

    private static void createAndShowGui() { 
     LayoutTest mainPanel = new LayoutTest(); 

     JFrame frame = new JFrame("Layout Test"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

@SuppressWarnings("serial") 
class LayoutPanel extends JPanel { 
    private static final Color BG = Color.BLACK; 
    private int sides = 5; 
    private static final int INNER_GAP = 1; 
    private static final Color CELL_BG = Color.WHITE; 

    public LayoutPanel(int cellWidth, int sides) { 
     setBackground(BG); 
     setBorder(BorderFactory.createLineBorder(BG)); 
     this.sides = sides; 
     setLayout(new GridLayout(sides, sides, INNER_GAP, INNER_GAP)); 
     Dimension cellDim = new Dimension(cellWidth, cellWidth); 
     for (int i = 0; i < sides * sides; i++) { 
      JLabel label = new JLabel(".", SwingConstants.CENTER); 
      label.setPreferredSize(cellDim); 
      label.setBackground(CELL_BG); 
      label.setOpaque(true); 
      add(label); 
     } 
    } 
} 
+0

底部的畫面是填充整個的JFrame JPanel中。我希望JPanel不要佔用整個JFrame,這樣我就可以添加一些空間來添加其他組件,如按鈕 – NoobestPros

+0

@NoobestPros:您需要嵌套JPanel才能達到這種效果,並且允許簡單地創建複雜的GUI。請參閱編輯中的代碼以回答。 –

+0

例如,@camickr在創建此示例時發佈的已刪除評論中聲明,如果您使用一個BorderLayout嵌套您的GridLayout-使用JPanel,則可以創建所需的GUI。 –

相關問題