Вопрос

как я могу расположить кнопки рядом друг с другом?Я использовал GridBagLayout для разработки макета.Проблема в том, что кнопки расположены слишком далеко друг от друга.Я попытался выбрать ЦЕНТР в качестве привязки, но это приводит к перекрытию кнопок.Если бы я использовал ЗАПАД и ВОСТОК, кнопки располагались бы слишком далеко друг от друга.

например ,СОХРАНИТЬ ---------- НОВЫЙ ШАБЛОН вместо СОХРАНЕНИЯ 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);
Это было полезно?

Решение

Спасибо akf, я решил проблему, поместив 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);
....

Другие советы

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

Почему бы вам сначала не прочитать свои старые публикации, прежде чем публиковать новые вопросы?

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

Вместо того , чтобы 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);

Редактировать:

Просто из любопытства я повозился с вашим оригиналом и нашел комбинацию, которая позволяет использовать только 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);

Этот код расположит кнопки рядом в центре экрана.

Ключевыми являются :

constraints.fill=GridBagConstraints.NONE;--> сделать так, чтобы бутоны не расширялись

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

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

ограничения.weightx=1 -> создает ячейку, в которой кнопки расширяются по горизонтали.

ограничения.anchor=GridBagConstraints.EAST;--> переводит левую кнопку в начало ячейки

ограничения.привязка=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);
    }

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top