2015-04-14 7 views
0

У меня проблема с GridbagLayout; У меня 5 кнопок, и я хочу, чтобы они были такими: Target ButtonDispositionJava GridBagLayout Выравнивание кнопок

Я уже пробовал разные подходы, но никто не работает правильно.

Например:

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestGridBagLayout { 

    protected void initUI() { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel southPanel = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     gbc.gridwidth = 2; 
     gbc.gridy = 0; 
     JButton enterRoom = new JButton("Enter room"); 
     JButton exitRoom = new JButton("Exit room"); 
     JButton login = new JButton("Login"); 
     JButton logout = new JButton("Logout"); 
     JButton whoIsIn = new JButton("Who is in"); 

     gbc.gridx = 1; 
     southPanel.add(enterRoom, gbc); 

     gbc.gridx = 5; 
     southPanel.add(exitRoom, gbc); 

     gbc.gridy = 1; 

     gbc.gridx = 0; 
     southPanel.add(login, gbc); 

     gbc.gridx = 3; 
     southPanel.add(logout, gbc); 

     gbc.gridx = 6; 
     southPanel.add(whoIsIn, gbc); 

     frame.add(southPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestGridBagLayout().initUI(); 
      } 
     }); 
    } 
} 

Появляется: wrong buttons aligning Я не заинтересован в других подходах (например, GridLayout), я хотел бы знать, что я пропускаю.

+0

Для лучшей помощи раньше, опубликовать [MCVE] (HTTP: //stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (короткий, самосохраненный, правильный пример). –

+0

@AndrewThompson Я положил мкв, который я сделал на моей стороне. Я думаю, что это воспроизводит проблему, которую видит ОП. Скорее всего, проблема заключается лишь в том, что ширина сетки применяется только в том случае, если в другой строке используется другой компонент для «натянутого» столбца –

ответ

2

GridbagLayout, похоже, требует строку, в которой компонент занимает все столбцы в строке. См.: Why does this GridBagLayout not appear as planned? на основе этого решения.

Обратите внимание, что размер горизонтальной стойки был выбран на половину размера кнопки «Выход», чтобы две ячейки имели ширину кнопки выхода, чтобы обеспечить центрирование компонентов, которые вы желаете.

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

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     JButton enterRoom = new JButton("Enter room"); 
     JButton exitRoom = new JButton("Exit room"); 
     JButton login = new JButton("Login"); 
     JButton logout = new JButton("Logout"); 
     JButton whoIsIn = new JButton("Who is in"); 

     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.insets = new Insets(5, 0,5, 0); 

     gbc.gridwidth = 2; 

     gbc.gridx = 1; 
     gbc.gridy = 0; 
     add(enterRoom, gbc); 

     gbc.gridx = 5; 
     gbc.gridy = 0; 
     add(exitRoom, gbc); 

     gbc.gridx = 0; 
     gbc.gridy = 1; 
     add(login, gbc); 

     gbc.gridx = 3; 
     gbc.gridy = 1; 
     add(logout, gbc); 

     gbc.gridx = 6; 
     gbc.gridy = 1; 
     add(whoIsIn, gbc); 

     // Add dummy components so every cell has a component. 

     gbc.insets = new Insets(0, 0, 0, 0); 
     gbc.gridwidth = 1; 
     gbc.gridy = 2; 
     int strutWidth = logout.getPreferredSize().width/2; 

     for (int i = 0; i < 8; i++) 
     { 
      gbc.gridx = i; 
      add(Box.createHorizontalStrut(strutWidth), gbc); 
     } 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE(), BorderLayout.NORTH); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
2

GridBagLayout может быть странным животным в некоторых случаях. Но в любом случае, gridwidth - это то, что работает, только если есть фактический компонент, который требует некоторой ширины внутри «натянутого» столбца (например, если вы скажете gridx = 0 и gridwidth = 2, столбец 0 имеет компонент и «натянутый» "столбец 1).

В вашем случае столбец 2, 4 & 7 не имеют компонентов, поэтому их ширина установлена ​​в 0. Дополнения, столбец 5 также получает ширину 0, так как столбец 6 обеспечивает достаточное количество шума для кнопки выхода из комнаты, поэтому в конце вы получите результат, который видите.

Теперь, не уверен, какой тип макета вы пытаетесь достичь (я видел ваш снимок экрана, но как он должен себя вести, когда панель рушится/расширяется по ширине?). Так найти ниже, пример, который приходит немного ближе к тому, что вы описали (хотя я не нахожу это очень приятно)

Example

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestGridBagLayout2 { 

    protected void initUI() { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel southPanel = new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 

     gbc.gridy = 0; 
     JButton enterRoom = new JButton("Enter room"); 
     JButton exitRoom = new JButton("Exit room"); 
     JButton login = new JButton("Login"); 
     JButton logout = new JButton("Logout"); 
     JButton whoIsIn = new JButton("Who is in"); 

     gbc.gridx = 0; 
     gbc.weightx = 1.0; 
     gbc.anchor = GridBagConstraints.EAST; 
     southPanel.add(enterRoom, gbc); 

     gbc.anchor = GridBagConstraints.WEST; 
     gbc.gridx = 2; 
     southPanel.add(exitRoom, gbc); 

     gbc.gridy = 1; 

     gbc.gridx = 0; 
     southPanel.add(login, gbc); 

     gbc.weightx = 0; 
     gbc.gridx = 1; 
     southPanel.add(logout, gbc); 

     gbc.weightx = 1.0; 
     gbc.anchor = GridBagConstraints.EAST; 
     gbc.gridx = 2; 
     southPanel.add(whoIsIn, gbc); 

     frame.add(southPanel); 
     frame.pack(); 
     frame.setSize(frame.getWidth() * 4/3, frame.getHeight()); 
     frame.setMinimumSize(frame.getSize()); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestGridBagLayout().initUI(); 
      } 
     }); 
    } 
} 
Смежные вопросы