2010-03-30 6 views
2

Вот код:Почему setPreferredSize не меняет размер кнопки?

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

public class TestGrid { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Colored Trails"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(4, 9)); 
     panel.setMaximumSize(new Dimension(9*30-20,4*30)); 

     JButton btn; 
     for (int i=1; i<=4; i++) { 
      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(30, 30)); 
       panel.add(btn); 
      } 

      btn = new JButton(); 
      btn.setPreferredSize(new Dimension(30, 10)); 
      panel.add(btn); 

      for (int j=1; j<=4; j++) { 
       btn = new JButton(); 
       btn.setPreferredSize(new Dimension(30, 30)); 
       panel.add(btn); 
      } 

     } 
     mainPanel.add(panel); 
     frame.add(mainPanel); 

     frame.setSize(450,950); 
     frame.setVisible(true); 
    } 
} 

Я полагаю, есть таблица кнопок с 4 строк и 9 столбцов. И средний столбец должен быть более узким, чем другие столбцы. Я пробовал Dimension(30, 10) и Dimension(30, 10) оба эффекта не влияют на ширину среднего столбца. Зачем?

+2

Прочитайте учебник. Вы получили несколько ссылок на учебник Swing. Это ясно объясняется в учебнике «Как использовать грид-макет». Бросьте наводнение на форуме со всеми этими вопросами, пока не сделаете какое-то основное чтение. В настоящее время 7 вопросов, связанных с менеджерами макетов в последние пару дней. Это пугает мой разум, люди продолжают отвечать на эти вопросы, особенно когда вы не принимаете ответы на события. – camickr

+1

@camickr, никто не заставляет вас отвечать на мои вопросы. Есть люди, у которых есть вопросы, и есть люди, которые готовы ответить на эти вопросы. И эти люди могут найти общий язык и способ сотрудничества. Если вы не понимаете, почему это работает, просто не принимайте участия в этом. И не мешайте другим людям. – Roman

+1

Я понимаю, как это работает. Вы проводите некоторые исследования, и когда у вас возникла проблема, вы отправляете квесто с просьбой о помощи. Мы не здесь, чтобы делать чтение для вас. Если вы приложите усилия, мы приложим усилия. – camickr

ответ

7

Менеджеры макетов могут игнорировать предпочтительный размер. В частности, GridLayout всегда будет делать каждую ячейку в сетке точно такого же размера (по этой причине это довольно бесполезный менеджер макетов).

Вам нужно будет использовать другой менеджер компоновки, такой как вложенный BoxLayout или GroupLayout.

1

GridLayout довольно негибкий, поскольку каждая ячейка имеет одинаковый размер, обычно соблюдая самые большие настройки высоты и ширины любого объекта, добавленного в сетку.

Если строки и/или столбцы должны иметь разные размеры, вы должны использовать GridBagLayout.

-1

setPreferredSize не изменяет размер кнопки до тех пор, пока измерение не будет установлено с помощью параметра Измерение.

Пример: -

Dimension dim = new Dimension(20,20), then use setPerferredSize(dim).

+0

В этом случае установка параметра не поможет. Используется GridLayout, который не в полной мере соблюдает setPreferredSize. GridLayout устанавливает все высоты и ширину на основе максимальной ширины и высоты. Также обратите внимание, что наибольшая высота и ширина не должны исходить от одного и того же компонента. – Michael

0

Я нашел этот метод версию, которая подходит идеально подходит для вашего решения:

.addComponent (<>, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing .GroupLayout.DEFAULT_SIZE, <>)