2014-02-13 2 views
1

Я пытаюсь создать форму в Swing.Как можно центрировать выравнивание группы компонентов с помощью диспетчера макетов Swing весной

Форма должна выглядеть примерно так:

____________________________________ 
|___________________________________X| 
|         | 
|    ________________  | 
|  label1 [________________]  | 
|    ________________  | 
|  label2 [________________]  | 
|         | 
|         | 
|      [Save] [Close] | 
|____________________________________| 

Но у меня возникают проблемы, совместив центр текстовые поля по вертикали.

Ниже приведен код для открытия кадра:

public class Main { 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       LayoutTest test = new LayoutTest(); 
       test.setVisible(true); 
      } 
     }); 
    } 
} 

Вот код для парафирования поля и создания макета:

public class LayoutTest { 
    private JFrame testFrame; 

    JLabel label1; 
    JTextField field1; 

    JLabel label2; 
    JTextField field2; 

    JButton saveButton; 
    JButton closeButton; 

    public LayoutTest() { 
     testFrame = new JFrame(); 

     initProperties(); 
     initContent(); 
     initLayout(); 
    } 

    private void initProperties() { 
     testFrame.setTitle("Test"); 
     testFrame.setSize(1000, 800); 
     testFrame.setLocationRelativeTo(null); 
     testFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    } 

    private void initContent() { 
     label1= new JLabel("Label 1"); 
     field1= new JTextField(25); 
     label1.setLabelFor(field1); 

     label2= new JLabel("Label 2"); 
     field2= new JTextField(25); 
     label2.setLabelFor(field2); 

     saveButton = new JButton("Save"); 

     closeButton = new JButton("Close"); 
     closeButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       System.exit(0); 
      } 
     }); 

     testFrame.add(label1); 
     testFrame.add(field1); 
     testFrame.add(label2); 
     testFrame.add(field2); 
     testFrame.add(saveButton); 
     testFrame.add(closeButton); 
    } 

    private void initLayout() { 
     SpringLayout layout = new SpringLayout(); 

     layout.putConstraint(SpringLayout.NORTH, label1, 10, SpringLayout.NORTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.EAST, label1, -5, SpringLayout.WEST, field1); 

     layout.putConstraint(SpringLayout.NORTH, field1, 10, SpringLayout.NORTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, field1, -10, SpringLayout.HORIZONTAL_CENTER, testFrame.getContentPane()); 

     layout.putConstraint(SpringLayout.NORTH, label2, 10, SpringLayout.SOUTH, label1); 
     layout.putConstraint(SpringLayout.EAST, label2, -5, SpringLayout.WEST, field2); 

     layout.putConstraint(SpringLayout.NORTH, field2, 5, SpringLayout.SOUTH, field1); 
     layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, field2, -10, SpringLayout.HORIZONTAL_CENTER, testFrame.getContentPane()); 


     layout.putConstraint(SpringLayout.SOUTH, closeButton, -20, SpringLayout.SOUTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.EAST, closeButton, -20, SpringLayout.EAST, testFrame.getContentPane()); 

     layout.putConstraint(SpringLayout.SOUTH, saveButton, -20, SpringLayout.SOUTH, testFrame.getContentPane()); 
     layout.putConstraint(SpringLayout.EAST, saveButton, -10, SpringLayout.WEST, closeButton); 

     testFrame.setLayout(layout); 
    } 

    public void setVisible(boolean visible) { 
     testFrame.setVisible(visible); 
    } 
} 

Я пытался добавить поля к и затем используйте SpringLayout.VERTICAL_CENTER на панели, но ничего не появилось.

Как можно центрировать выравнивание полей в виде группы?

+0

Вы должны использовать ' SpringLayout'? – MadProgrammer

+0

Если вы можете предложить простой способ создать форму, мне нужно, не добавляя слишком много дополнительных компонентов (например, панелей и т. Д.), Тогда я с удовольствием переключился. «SpringLayout» представляется наиболее гибким, и это единственное, что мне не удалось сделать. –

+0

SpringLayout (аналогично более поздней версии GroupLayout) был разработан для использования в сборщиках, а не вручную. Поэтому я бы инвестировал в изучение причуд какого-то другого менеджера, моим личным текущим предпочтением является MigLayout – kleopatra

ответ

1

У вас есть любое количество вариантов в зависимости от ваших потребностей. Я предпочитаю GridBagLayout, но это потому, что я использую 15 лет.

Dialog 01

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FormLayout { 

    public static void main(String[] args) { 
     new FormLayout(); 
    } 

    public FormLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(8, 8, 8, 8); 
      gbc.anchor = GridBagConstraints.EAST; 

      add(new JLabel("Label 1"), gbc); 
      gbc.gridy++; 
      add(new JLabel("Label 2"), gbc); 

      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridy = 0; 
      gbc.gridx++; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      add(new JTextField(20), gbc); 
      gbc.gridy++; 
      add(new JTextField(20), gbc); 

      gbc.gridy++; 
      gbc.gridx++; 
      gbc.gridwidth = 1; 
      gbc.anchor = GridBagConstraints.EAST; 
      gbc.weightx = 1; 
      add(new JButton("Save"), gbc); 
      gbc.weightx = 0; 
      gbc.gridx++; 
      add(new JButton("Close"), gbc); 
     }   
    }   
} 

Проблема с этим, для меня, кнопки будут оставаться в центре формы, рядом с полями, так как при изменении размера окна

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

Compound layout

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class FormLayout { 

    public static void main(String[] args) { 
     new FormLayout(); 
    } 

    public FormLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 

      setLayout(new BorderLayout()); 

      JPanel content = new JPanel(new GridBagLayout()); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(8, 8, 8, 8); 
      gbc.anchor = GridBagConstraints.EAST; 

      content.add(new JLabel("Label 1"), gbc); 
      gbc.gridy++; 
      content.add(new JLabel("Label 2"), gbc); 

      gbc.anchor = GridBagConstraints.WEST; 
      gbc.gridy = 0; 
      gbc.gridx++; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      content.add(new JTextField(20), gbc); 
      gbc.gridy++; 
      content.add(new JTextField(20), gbc); 

      JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));  
      buttons.add(new JButton("Save")); 
      buttons.add(new JButton("Close")); 

      add(content); 
      add(buttons, BorderLayout.SOUTH); 
     }    
    }   
} 

Выбор однако, свой собственный ...

3

Использование вложенных панелей. Что-то вроде:

JPanel springPanel = new JPanel(...); 
springPanel.add(...); 

JPanel center = new JPanel(new GridBagLayout()); 
center.add(springPanel, new GridBagConstraints()); 

frame.add(center); 
Смежные вопросы