2015-04-25 3 views
-1

Я хочу установить размер моих JButtons, которые находятся в центре моего экрана, чтобы стать больше, но я не могу найти, как это сделать, используя GridBagLayouts.Как установить размер JButton с помощью GridBagLayout

Вот как это выглядит: This is what it looks like

Вот мой код:

//  Client 
    c.fill = GridBagConstraints.BOTH; 
    c.anchor = GridBagConstraints.CENTER; 
    c.gridy = 5; 
    c.gridx = 5; 
    c.gridwidth = 1; 
    c.gridheight = 1; 
    c.insets = new Insets(10, 1, 1, 10); 
    p.add(b[0], c); 

    //  Server 
    c.fill = GridBagConstraints.BOTH; 
    c.anchor = GridBagConstraints.CENTER; 
    c.gridy = 10; 
    c.gridx = 5; 
    c.gridwidth = 1; 
    c.gridheight = 1; 
    c.insets = new Insets(10, 1, 1, 10); 
    p.add(b[1], c); 

Я хочу, чтобы кнопки, чтобы занять большую часть пустого пространства вокруг них.

+0

Вы уверены, что кнопки не покрывают целую ячейку сетки? Вы добавляете их в положение (5,5). И если вы просто хотите сыграть две кнопки друг над другом FlowLayout, все больше подходят GridLayout, BorderLayout и BoxLayout. – maraca

+0

Я использовал 5,5 только для того, чтобы учесть, если мне когда-либо понадобится добавить что-нибудь в сторону, мне не нужно менять координаты сетки. – JavaFanatic

ответ

1

Дополнительная информация была добавлена: Кнопки имеют 50% от ширины и [о] 20% от высоты родителя (вместе 50% высоты, включая промежуток между ними). (Немного переписано в соответствии с предложением.)

Решением

Сочетание простых макетов макетов. Хотя, если вы будете это делать, как это вы будете иметь 3 колонки или 3 строки, которые не могут быть соединены, остальные могут быть легко изменены позже:

// row variation 

JPanel parent = new JPanel(); 
parent.setLayout(new GridLayout(3, 1)); 

parent.add(new JPanel()); // placeholder for 1st row 

JPanel row = new JPanel(); // 2nd row 
row.setLayout(new GridLayout(1, 3)); // create 3 cells of equal size 

row.add(new JPanel()); // 2nd row, 1st cell placeholder 

// now you have a 33% x 33% (oops) rectangle in the middle 
JPanel controls = new JPanel(); 
controls.setLayout(new GridLayout(2, 1, 10, 10)); 
controls.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10); 
controls.add(new JButton("Client")); 
controls.add(new JButton("Server")); 

row.add(controls); // add 2nd row, 2nd cell 

row.add(new JPanel()); // 2nd row, 3rd cell placeholder 

parent.add(row); // add 2nd row 

parent.add(new JPanel()); // placeholder for 3rd row 

Легко, но вы не сможете присоединиться к клеткам позже:

JPanel parent = new JPanel(); parent.setLayout (newGridLayout (9, 9));

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

Старый Ответ

Альтернативное решение: Используйте BoxLayout

BoxLayout более интуитивным и проще понять, если смотреть на код (конечно, это только мнение).

  1. Решите, как structered ваше окно (это больше похоже на больших горизонтальных компонентов на верхней части друг друга PAGE_AXIS или большие вертикальные компоненты рядом друг с другом LINE_AXIS) и использовать в качестве внешнего BoxLayout:

    JPanel content = new JPanel(); // or frame 
    content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS)); 
    
  2. Добавьте компоненты вдоль оси, где у вас есть более одного компонента вдоль другой оси, используйте второй BoxLayout. Вы можете размещать компоненты, создавая жесткие области (пустые прямоугольники всегда имеют одинаковый размер) или путем добавления клея (расширяющегося, как жевательная резинка, вместе с компонентами).

    content.add(BoxLayout.createHorizntalGlue()); 
    
    JPanel col = new JPanel(); 
    col.setLayout(new BoxLayout(col, BoxLayout.PAGE_AXIS)); 
    JButton clientBtn = new JButton("Client"); 
    JButton serverBtn = new JButton("Server"); 
    col.add(BoxLayout.createVerticalGlue());   
    col.add(clientBtn); 
    col.add(BoxLayout.createRigidArea(new Dimension(1, 10))); 
    col.add(serverBtn); 
    col.add(BoxLayout.createVerticalGlue()); 
    content.add(col); 
    
    content.add(BoxLayout.createHorizontalGlue()); 
    
+0

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

+0

Я делаю это как свое главное меню. Я буду перерисовывать его позже с другим макетом, но я хочу знать, как это сделать, чтобы я мог реализовать его в будущем. Что касается размера, тот же процент, но изменяется при изменении размера окна. Большое спасибо за помощь – JavaFanatic

+0

@JavaFanatic Если вы действительно хотите создать сложный макет, то GridBagLayout - не плохой выбор, возможно, расстояние можно было бы установить, добавив несколько фиктивных панелей, но если вы также захотите изменить размер шрифта и границы и т. д., тогда нет возможности обрабатывать события изменения размера. – maraca

1

Я не могу представить себе, что вы хотите, но если вы хотите, чтобы ваша кнопка, чтобы заполнить вокруг, вы можете добавить

c.weightx = ...; //Specifies how to distribute extra horizontal space. 
    or c.weighty = ...; //Specifies how to distribute extra vertical space. 
+0

Я пробовал этот метод, и это заканчивается тем, что моя кнопка слишком сильно заполняет все пространство. Я тоже этого не хочу. – JavaFanatic

+0

только инструкция по установке: yourButton.setPreferredSize (новое измерение (w, h)); –

+0

сейчас он работает, спасибо! Было бы возможно, однако, установить его на размер относительно размера окна, чтобы при изменении размера окна, так же как и кнопки? – JavaFanatic

1
button.setMargin(new Insets(50, 50, 50, 50)); 

Это добавит дополнительное пространство для кнопки и позволяет менеджерам компоновки делать свою работу на основе предпочтительного размера кнопки.

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