2016-12-18 6 views
0

enter image description hereМожно ли задать определенный размер границы для JFrame, когда он содержит GridLayout?

Это класс образец

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

Это класс Layout, который поставляется с ним

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

Итак, мой вопрос в том, как я могу размер фиксированного размера, как изображение выше? Я хочу позже добавить компоненты, такие как кнопки на нем позже. Я не могу понять, как установить фиксированный размер JPanel после применения GridLayout к нему. Я добавил GridLayout, потому что мне нужно отобразить что-то похожее на шахматы. Я ничего не трону, кроме кнопок. JPanel для просмотра, вот и все.

Следует упомянуть, что я буду менять точки в середине сетки на другие символы (такие как! Или #), чтобы представлять объекты в пространстве 5x5. Я использую JLabel для представления объектов. Если я использую GridBagLayout, все символы раздаются вместе в 1 области.

ответ

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

картинка на дне является JPanel, который заполняет всю JFrame. Я хочу, чтобы JPanel не занимал весь JFrame, поэтому у меня есть место для добавления дополнительных компонентов, таких как кнопки – NoobestPros

+0

@NoobestPros: вам нужно вложить JPanels для достижения этого эффекта и позволить простое создание сложных графических интерфейсов. Пожалуйста, см. Код в редакции для ответа. –

+0

Например, поскольку @camickr изложено в удаленном комментарии, опубликованном при создании этого примера, если вы вставляете свой GrinLayout-используя JPanel в BorderLayout с помощью одного, вы можете создать желаемый графический интерфейс. –

 Смежные вопросы

  • Нет связанных вопросов^_^