2015-06-06 7 views
1

Я прочитал несколько вопросов, в которых говорилось, что GBL лучше, чем обычный GridLayout для позиционирования компонентов.GridBagLayout: настройка положения компонентов

Ссылки: first, second, Oracle Tutorial

Ну так что я пытался добавить некоторые компоненты (кнопки) на мой GBL, но это как-то всегда центры мои компоненты. Единственный способ разделить 2 кнопки - разместить «Макеты» в моем проекте, который выглядит ужасно.

public class GridGUI extends JPanel { 

private JButton button; 

public GridGUI() { 
    setLayout(new GridBagLayout()); 
    GridBagConstraints comps = makeGbc(0,1); 
    JPanel panel = new JPanel(); 
    button = new JButton("Datei speichern"); 
    button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

    }); 
    panel.add(button); 
    add(panel,comps); 

    comps = makeGbc(1,1); 
    button = new JButton("Datei laden"); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(new JPanel()); 
    panel.add(button); 
    add(panel,comps); 
} 

private GridBagConstraints makeGbc(int x, int y) { 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.gridwidth = 1; 
    gbc.gridheight = 1; 
    gbc.gridx = x; 
    gbc.gridy = y; 
    gbc.weightx = x; 
    gbc.weighty = 1.0; 
    gbc.insets = new Insets(5, 5, 5, 5); 
    gbc.anchor = (x == 0) ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END; 
    gbc.fill = GridBagConstraints.HORIZONTAL; 
    return gbc; 
} 

public static void showGUI() { 
    JFrame frame = new JFrame("Pop-Art-Collage"); 
    frame.getContentPane().add(new GridGUI()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setSize(800, 800); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      showGUI(); 
     } 

    }); 
} 

} 

The GUI

Но я хочу, чтобы они появились в верхней части графического интерфейса пользователя, а не в центре.

Также я попытался изменить размер кнопок с помощью button.setSize(x,y), но они всегда оставались неизменными.

Заранее спасибо

Edit:

Хорошо теперь я попробовал решение, которое я получил, но я попал в некоторых других проблем.

GridBagConstraints comps = makeGbc(0,1,20,50,0,0); 
    button = new JButton("Datei speichern"); 
    button.setPreferredSize(new Dimension(200,25)); 
    add(button,comps); 
    JButton button2 = new JButton("Datei laden"); 
    button2.setPreferredSize(new Dimension(100,25)); 
    comps = makeGbc(1,1,20,150,0,100); 
    add(button2,comps); 

new

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

ответ

3

Ваших кнопок в середине, а не на вершине, потому что вы поместите его там:

gbc.anchor = (x == 0) ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END; 

GridBagConstraints.LINE_END и GridBagConstraints.LINE_START ставит компоненты в центре. Попробуйте с:

gbc.anchor = (x == 0) ? GridBagConstraints.FIRST_LINE_START : GridBagConstraints.FIRST_LINE_END; 

также:

  • попытаться установить размер кнопок с setPreferredSize(), GBL с frame.pack() должны соблюдать Выбирается размеры,

  • добавить свои кнопки в новом JPanels и затем в контейнер с GBL, поэтому он размещает ваши кнопки в центре. Добавьте кнопки непосредственно GridGUI, и он будет помещен в соответствии с GridBagConstraints(), например:

    button = new JButton("Datei laden"); 
    add(button,makeGbc(1,1)); 
    
  • использовать одно поле класса JButton button, для двух разных кнопок, таким образом, вы не в состоянии изменить первое состояние кнопки , после того, как вы измените ссылку на кнопку - если вы попытаетесь изменить, например, текст в кнопке, из другой части приложения, используя поле класса button, вы можете получить доступ только к второй кнопке.

EDIT

Я не уверен, что эффект, который вы точно хотите, но я хотел бы попробовать, чтобы добавить свой GridGUI первого в новый JPanel, затем к JFrame (в основном методе):

JFrame frame = new JFrame("Pop-Art-Collage"); 
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); //add FlowLayout.LEFT, 
panel.add(new GridGUI()); 
frame.getContentPane().add(panel); 

Теперь FlowLayout должен содержать все компоненты слева, и вы можете управлять пространством между кнопками, меняя вставки. Для первой кнопки a будет устанавливать все входы на 0, а во втором - new Insets(0,x,0,0), где x - желаемое расстояние. Как это:

add(button,makeGbc(0,1,0,0,0,0)); 
add(button2,makeGbc(0,1,0,150,0,0)); 

Но я не уверен, как этот набор макетов будет вести себя, когда вы добавляете больше компонентов, таким образом, более простой способ, заключается в использовании только frame.pack(), без frame.setSize(), а затем расширить его, добавив новые компоненты. Тогда должно быть легче предсказать, как будут работать изменения.

Также обратите внимание на то, что в приведенном выше примере кода вы устанавливаете разные кнопки setPreferredSize() для обеих кнопок.

+0

(1+), 'Единственный способ разделить 2 кнопки - это поместить Макеты в мой проект, который выглядит ужасно. Вы используете« вставки », которые управляют пространством между двумя компонентами, поэтому меняйте вставки. – camickr

+0

@AndrewThompson благодарит вас за ваш комментарий, я уже отредактировал свой ответ! Я, очевидно, не знал этого. –

+0

, но каким образом мне нужно работать с вставками? Что они должны делать? Если я изменю Вставку, например, (100,0,0,0), он ничего не меняет – NhatNienne

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