2016-12-18 35 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。 –

相关问题