2016-12-18 12 views
0

enter image description hereJFrameにGridLayoutが含まれている場合に、特定のボーダーサイズを設定できますか?

これは

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; 
    } 
} 

これは、それが付属していレイアウトクラスである

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); 
     } 
} 

サンプルクラスでコードの結果がこれです:

enter image description here

だから、私の質問は、上記の画像のように固定サイズのサイズを変更する方法です。後でボタンのようなコンポーネントを後で追加したいと思います。私はGridLayoutを適用した後、JPanelの固定サイズを設定する方法を理解できません。チェスに似たものを表示するためにGridLayoutを追加しました。私はボタンを除いて何も触れません。 JPanelはそれを表示するためのものです。

5x5空間のオブジェクトを表すために、グリッドの中央にあるドットを他の記号(!や#など)に変更します。私はオブジェクトを提示するためにJLabelを使用します。 GridBagLayoutを使用すると、すべてのシンボルが1つの領域にまとめられます。

答えて

2

あなたが求めていることを理解しているかどうかはわかりませんが、グリッド周辺の空きスペースが欲しい場合は、おそらくBorderFactor.createEmptyBorder(gap, gap, gap, gap);経由で取得されたEmptyBorderです境界のサイズです。もちろん、それぞれの面で一意の値にすることができます。

最大のレイアウト効果を得るために、それぞれ独自のレイアウトを使用するJPanelをネストすることを忘れないでください。たとえば、以下の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:この効果を実現し、複雑なGUIを簡単に作成できるように、JPanelsをネストする必要があります。答えには編集のコードを見てください。 –

+0

たとえば、@camickrが削除されたコメントに記載されているように、この例を作成していたときに、BorderLayout内でJPanelを使用してGridLayoutをネストすると、目的のGUIを作成できます。 –

関連する問題