2015-09-17 3 views
1

У меня возникли трудности с выравниванием элементов Swing, расположенных ниже друг друга. Использование GridLayout не помогает мне, потому что оно делит экран на строки, имеющие одинаковые размеры. Мне нужно поместить один компонент в каждую строку, а следующий компонент должен находиться в самом низу последнего компонента.Как выровнять несколько элементов друг под другом?

проблема Mi том, что если выборы вопроса более чем одна линия, эта схема выдавить их рядам и существует огромный разрыв между изображением и вопрос «3 + 3?»

+0

Вы можете добавить скриншот текущего интерфейса вы имеете и объяснить проблему? – shan1024

+0

http://i.stack.imgur.com/nGrlF.png – Xlerone

+0

1) Чтобы лучше помочь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) Чтобы сжать один столбец «GridLayout» до минимума, который ему нужен в верхней или нижней части контейнера, поместите панель с макетом сетки в 'PAGE_START' или' PAGE_END' ограничение 'BorderLayout'. –

ответ

3

Вы можете использовать GridBagLayout для этого. Он очень прост в использовании. Вот пример реализации.

enter image description here

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 

class MyFrame extends JFrame { 

    public MyFrame() { 
     JPanel panel = new JPanel(new GridBagLayout()); 

     JLabel image = new JLabel(); 
     image.setIcon(new ImageIcon(getClass().getResource("/image.png"))); 

     JLabel question = new JLabel("3 + 3 = ?"); 

     JRadioButton rb1 = new JRadioButton("5"); 
     JRadioButton rb2 = new JRadioButton("3"); 
     JRadioButton rb3 = new JRadioButton("6"); 
     JRadioButton rb4 = new JRadioButton("9"); 
     JRadioButton rb5 = new JRadioButton("23"); 

     GridBagConstraints c = new GridBagConstraints(); 

     c.gridx = 0;//set the x location of the grid for the next component 
     c.gridy = 0;//set the y location of the grid for the next component 
     panel.add(image,c); 

     c.gridy = 1;//change the y location 
     c.anchor=GridBagConstraints.WEST;//left align components after this point 
     panel.add(question,c); 

     c.gridy = 2;//change the y location 
     panel.add(rb1,c); 

     c.gridy = 3;//change the y location 
     panel.add(rb2,c); 

     c.gridy = 4;//change the y location 
     panel.add(rb3,c); 

     c.gridy = 5;//change the y location 
     panel.add(rb4,c); 

     c.gridy =6;//change the y location 
     panel.add(rb5,c); 

     this.getContentPane().add(panel); 

     this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.pack(); 
    } 

    public static void main(String[] args) { 
     MyFrame myFrame = new MyFrame(); 
     myFrame.setVisible(true); 
    } 

} 

Ссылки: https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

+0

Это работает, но проблема в том, что он всегда центрирует компоненты после изображения. Компоненты после изображения должны быть оставлены alligned.I не мог сделать это – Xlerone

+0

'c.anchor' должен быть установлен в соответствие. – shan1024

+0

«c.achor» не работает. Если вы выполняете свой код, когда вы изменяете размер кадра, этот макет помещает компоненты в центр кадра. – Xlerone

2

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

GridBagLayout

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

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

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

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 

      JLabel label = new JLabel("Cool"); 
      label.setFont(label.getFont().deriveFont(Font.BOLD, 48f)); 
      label.setOpaque(true); 
      label.setBackground(Color.WHITE); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 

      add(label, gbc); 
      add(new JLabel("3+5="), gbc); 
      add(new JCheckBox("5"), gbc); 
      add(new JCheckBox("3"), gbc); 
      add(new JCheckBox("6"), gbc); 
      add(new JCheckBox("9"), gbc); 
      add(new JCheckBox("23"), gbc); 
     } 

    } 

} 

Вы можете использовать даже anchor для перемещения компонентов в разных позициях внутри там клеток ...

gbc.anchor = GridBagConstraints.WEST; 

Anchor

Они могут, очевидно, быть применены к отдельным компонентам, так что каждый компонент может иметь собственный набор ограничений

Посмотрите How to Use GridBagLayout для получения более подробной информации

+0

Это также было бы полезно, если бы правильный ответ был одним из вариантов. – FredK

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