2011-01-20 2 views
1
public class Some extends JFrame{ 
    public Some(){ 
     //Create panel for the buttons and set Grid Layout 
     JPanel p1 = new JPanel(); 
     p1.setLayout(new GridLayout(20, 20)); 

     //Add buttons to the panel 
     for(int i = 1; i <= 20; i++){ 
      for(int j = 1; j <= 20; j++){ 
       JButton newButton = new JButton(); 
       newButton.setSize(10,10); 
       newButton.setBackground(Color.WHITE); 
       p1.add(newButton); 
      } 
     } 

     //add contents into the frame 
     add(p1); 
    } 

мой вопрос, как я могу заставить мою панель p1, чтобы растянуть по всей моей раме, например, у меня есть некоторые пробелы в настоящее время используют этот класс, спасибо заранеевыравнивание свингом

Отредактировано в моем main Я использую метод

frame.setSize(400, 400); 

возможно, это проблема?

+0

Ваша панель p1 уже занимает весь кадр. Установите цвет фона, и вы увидите. Вопрос должен состоять в том, как вы можете получить макет, чтобы использовать все пространство. –

ответ

0

Проблема заключается в том, что GridLayout гарантирует, что все компоненты имеют одинаковый размер. Это означает, что ширина и высота панели (p1) должны быть кратными 20, чтобы компоненты достигли края. Вы можете либо убедиться, что панель фиксированный размер, как это (в конце конструктора):

setResizable(false); 
p1.setPreferredSize(new Dimension(400, 400)); 
add(p1); 
pack(); 

Ваш вызов frame.setSize (...) не делал панель 400 на 400, потому что размер кадра включает границу вокруг кадра.

В качестве альтернативы вы можете использовать собственный менеджер макетов, который не гарантирует, что все кнопки имеют одинаковый размер. Этот пример заставит кнопку заполнить всю площадь панели:

private static class FullyJustifiedGridLayout implements LayoutManager { 
    private final int rows; 
    private final int columns; 

    public FullyJustifiedGridLayout(int rows, int columns) { 
     this.rows = rows; 
     this.columns = columns; 
    } 

    @Override 
    public void layoutContainer(Container parent) { 
     synchronized (parent.getTreeLock()) { 
      double clientWidth = parent.getWidth() - parent.getInsets().left - parent.getInsets().right; 
      double clientHeight = parent.getHeight() - parent.getInsets().top - parent.getInsets().bottom; 
      for (int i = 0; i < parent.getComponents().length; i++) { 
       Component component = parent.getComponents()[i]; 
       int row = i/rows, column = i % columns; 
       int x = (int)(clientWidth * column/columns); 
       int y = (int)(clientHeight * row/rows); 
       int nextX = (int)(clientWidth * (column + 1)/columns); 
       int nextY = (int)(clientHeight * (row + 1)/rows); 
       component.setBounds(x, y, nextX - x, nextY - y); 
      } 
     } 
    } 

    @Override 
    public Dimension minimumLayoutSize(Container parent) { 
     return new Dimension(20 * 10, 20 * 10); 
    } 

    @Override 
    public Dimension preferredLayoutSize(Container parent) { 
     return new Dimension(20 * 20, 20 * 20); 
    } 

    @Override 
    public void removeLayoutComponent(Component comp) { 
    } 

    @Override 
    public void addLayoutComponent(String name, Component comp) { 
    } 
} 

Просто замените вызов нового GridLayout (20, 20) с новым FullyJustifiedGridLayout (20, 20).

Кроме того, при использовании менеджеров компоновки нет необходимости вызывать setSize, setLocation или setBounds для компонентов - они вызывается менеджером компоновки, когда она отображает панель. Если вы хотите изменить размеры компонентов, вместо этого используйте setPreferredSize.

1

Самый простой способ - установить макет в BorderLayout, а затем вставить панель в центр.

public class Some extends JFrame{ 
    public Some(){ 
    //Create panel for the buttons and set Grid Layout 
    JPanel p1 = new JPanel(); 
    p1.setLayout(new GridLayout(20, 20)); 

    //Add buttons to the panel 
    for(int i = 1; i <= 20; i++){ 
     for(int j = 1; j <= 20; j++){ 
      JButton newButton = new JButton(); 
      newButton.setSize(10,10); 
      newButton.setBackground(Color.WHITE); 
      p1.add(newButton); 
     } 
    } 

    //add contents into the frame 
    this.setLayout(new BorderLayout()); 
    add(p1, BorderLayout.CENTER); 
} 
+0

@Dsynomic: не работает – rookie

+0

Где вы видите пробелы? – Dsynomic

+0

справа Я вижу серое пространство, а также под – rookie

0

Это во многом зависит от менеджера компоновки кадра, но в целом вы должны установить максимальный размер панели до (Integer.MAX_VALUE, Integer.MAX_VALUE), чтобы позволить ему растягиваться:

p1.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE))

+0

и это мне не помогает. – rookie

+1

Это панель по умолчанию, использующая GridLayout, поэтому вызов setMaximumSize не имеет значения. Кроме того, как вы упомянули, макет, используемый на панели содержимого фрейма (BorderLayout), игнорирует максимальный размер. –

0

новыйButton.setSize (10,10);

frame.setSize (400, 400); может это проблема?

Вы пытаетесь установить размер 10 пикселей и у вас есть 20 компонентов, так почему бы установить размер 400? 200 было бы более близким, хотя это все равно было бы неправильно (потому что вам нужно разрешить пространство для границ кадра).

Вне вас цикла вы должны создать переменную:

Dimension preferred = new Dimension(10, 10); 

Тогда внутри вас петли вы должны использовать:

newButton.setPreferredSize(preferred); 

Затем вы можете использовать:

//frame.setSize(400, 400); 
frame.setResizeable(false); 
frame.pack(); 

Рамка будет соответствовать размеру, чтобы не было лишнего места.

0

Две точки:

[1] На JFrame, вы добавляете материал к его getContentPane(), контейнер.

[2] Либо (a) setPreferredSize() для JButton (используйте новый размер()) и pack() JFrame, либо (b) setSize (Dimension) для JFrame и пусть LayoutManager имеет размер JButtons. Используя свой подход (а), код выглядит следующим образом (я добавил основные() для его компиляции/запуска)

К сожалению, я не могу получить форматирование/углубления, чтобы правильно работать :(

import java.awt.*; 

import javax.swing.*; 

public class Some extends JFrame{  

    public Some(){   
     //Create panel for the buttons and set Grid Layout   
     JPanel p1 = new JPanel();   

     p1.setLayout(new GridLayout(20, 20)); //Add buttons to the panel 

     for(int i = 1; i <= 20; i++){ 
      for(int j = 1; j <= 20; j++){ 
       JButton newButton = new JButton(); 
       newButton.setPreferredSize(new Dimension (10,10)); 
       newButton.setBackground(Color.WHITE); 
       p1.add(newButton); 
     }} 

     //add contents into the frame 
     getContentPane().add(p1); 

     pack(); 
    } 

    public static void main (String[] args) { 
     new Some().setVisible(true); 
    } 
} 
+1

Поскольку Java 5 frame.getContentPane(). Add (...) и frame.add (...) эквивалентны. Последнее обычно предпочтительнее для краткости. –

+0

Спасибо. Как-то я пропустил это. –

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