2009-10-08 3 views
0

как я могу сделать кнопку рядом с вами. Я использовал gridBagLayout для разработки макета. Проблема в том, что кнопка слишком далеко друг от друга. Я попытался выбрать CENTER как привязку, но это делает перекрытие кнопки. Если я использовал WEST и EAST, кнопка была слишком далеко друг от друга.Поместите кнопку рядом друг с другом

например. SAVE ---------- NEW PATTERN вместо SAVE NEW_PATTERN.

JButton bSave = new JButton("SAVE"); 
JButton bPattern = new JButton("NEW_PATTERN"); 
con = new GridBagConstraints(); 
con.anchor=GridBagConstraints.WEST; 
con.gridy = 3; con.gridx = 0;   
con.gridwidth = 1; con.gridheight = 1;  
con.insets= new Insets(2,5,2,2);   
m.setConstraints(bSave, con); 
c.add(bSave); 
con.weightx=1; 
con.gridy=3; con.gridx=0; 
con.anchor=GridBagConstraints.EAST; 
m.setConstraints(bPattern,con); 
c.add(bPattern); 

ответ

1

Благодаря АКФ, я решил эту проблему путем размещения FlowLayout внутри GridBagLayout.

.... 
JButton bSave = new JButton("Save"); 
JButton bPattern = new JButton("New Pattern"); 
JPanel pContainer = new JPanel(); 
pContainer.setLayout(new FlowLayout(FlowLayout.CENTER)); 
pContainer.add(bSave); pContainer.add(bPattern); 
con = new GridBagConstraints(); 
con.anchor=GridBagConstraints.CENTER; 
con.gridy = 3; con.gridx = 0;   
con.gridwidth = 1; con.gridheight = 1;  
m.setConstraints(pContainer, con); 
c.add(pContainer); 
.... 
1

GridBagLayout является самым сложным из макетов. Если вы просто выровняете пару кнопок, я бы рекомендовал использовать FlowLayout (по умолчанию) или BoxLayout. Но, если вы хотите использовать GridBagLayout, вместо настройки якоря, отрегулируйте gridx равным 1 для второй кнопки. Кроме того, не уверен, почему у вас есть сетка из 3 вместо gridy из 0 (если нет другого кода, который вы пропустили, который использует сетку 0-2).

0

Почему вы не читаете свои старые сообщения прежде, чем размещать новые вопросы?

Вы получили ссылку на учебник Swing в своем последнем сообщении. Поэтому прочитайте учебник, попробуйте примеры и используйте соответствующий менеджер макета или комбинацию менеджеров макетов для задания.

0

Вместо GridBagLayout, GridLayout это простое решение. Легко настроить:

JButton bSave = new JButton("SAVE"); 
JButton bPattern = new JButton("NEW_PATTERN"); 
JPanel panel = new JPanel(new GridLayout(1,2); // 1 row, 2 cols 
panel.add(bSave); 
panel.add(bPattern); 

EDIT:

Просто из любопытства, я дурачился с вашим оригинальным и нашел комбинацию, которая позволяет для использования только GridBagLayout. Это не сильно отличается от оригинала:

GridBagConstraints con = new GridBagConstraints(); 
con.anchor=GridBagConstraints.WEST; 
con.gridy = 3; 
con.gridx = 0;     
con.gridwidth = 1; 
con.gridheight = 1;   
con.insets= new Insets(2,5,2,2);   
m.setConstraints(bSave, con); 
c.add(bSave); 
con.weightx=0; 
con.gridy=3; 
con.gridx=1;//this is the big diff! 
con.anchor=GridBagConstraints.EAST; 
m.setConstraints(bPattern,con); 
c.add(bPattern); 
+0

Возможно ли одновременное использование gridBagLayout и flowLayout? – Jessy

+0

Да и Нет. В «Контейнере» может быть только один «LayoutManager». Однако в вашем GridBagLayout вы можете добавить «JPanels», и эти «JPanels» могут использовать свой собственный «LayoutManager», поэтому вы можете иметь «FlowLayout» в одной из этих панелей. – akf

+0

Спасибо akf, я решил проблему с вашим кодом :-) ... – Jessy

0

Я предлагаю вам прочитать учебник для GridBagLayout, так как это из коробки самый продвинутый менеджер компоновки и делает остальные устарели. Это стоит изучить по этим причинам. Это делает все просто, если вы думаете об этом как о сетке, и все, что вам нужно получить, это координаты x и y, которые вы пропустили в своем коде. Вы были почти там :)

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

@camickr Основываясь на моем комментарии, люди должны использовать GridBagLayout, поскольку он является самым гибким и может использоваться в любой ситуации. Только одно должно привести к простому и поддерживаемому. Я также считаю, что это очень легко читать, поскольку оно логически отображено. Контракты изменяются только в том случае, если вы используете один объект ограничений для всех компонентов, что, очевидно, является плохой идеей.

+0

Написание простейшего, наиболее удобного кода должно быть целью. Это означает использование соответствующего менеджера макетов для задания. Это не означает, что каждый макет должен использовать один и тот же менеджер компоновки. GridBagLayout изначально использовался IDE, потому что IDE недостаточно интеллектуальны, чтобы разбить GUI на более мелкие логические группы, что приводит к сложному не поддерживаемому коду, в котором изменение одного ограничения влияет на остальные. Основываясь на вашем предположении, каждый должен использовать GroupLayout, поскольку он является последним макетом для IDE, в результате получается просто нечитаемый, неподдающийся безопасности код. – camickr

0

Этот код размещает кнопки рядом друг с другом в центре экрана.

Ключ являются:

constraints.fill = GridBagConstraints.NONE; -> сделать butons не расширять

constraints.insets.вправо = 0; -> делает кнопки стоять бок о бок

constraints.insets.left = 0; -> делает кнопки стоять бок о бок

constraints.weightx = 1 -> делает клетка Wich кнопки являются EXPANDO горизонтально

constraints.anchor = GridBagConstraints.EAST; -> делает левую кнопку, чтобы стоять на клетки

constraints.anchor = GridBagConstraints.WEST; -> марки правую кнопку, чтобы стоять слева от ячейки

public static void main(String args[]){ 
     JFrame frame=new JFrame(); 
     Container cont=frame.getContentPane(); 
     cont.setLayout(new GridBagLayout()); 

     GridBagConstraints constraints=new GridBagConstraints(); 
     constraints.insets.top=2; 
     constraints.insets.bottom=2; 
     constraints.insets.left=0;// increment to separate buttons 
     constraints.insets.right=0;// increment to separate buttons 
     constraints.fill=GridBagConstraints.NONE; 
     constraints.weightx=1; 
     constraints.gridy=0; 

     constraints.anchor=GridBagConstraints.EAST; 
     constraints.gridx=0; 
     cont.add(new JButton("Save"),constraints); 

     constraints.anchor=GridBagConstraints.WEST; 
     constraints.gridx=1; 
     cont.add(new JButton("New Pattern"),constraints); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
Смежные вопросы