2016-11-03 9 views
-1

Я новичок в JAVA и GUI. Я создаю экран графического интерфейса для моего проекта.Почему вертикальный разрыв GridLayout продолжает расти?

Я сделал GridLayout с 2 рядами. Первая строка имеет FlowLayout, а вторая строка имеет номер BoxLayout. Панель с FlowLayout будет постоянной во всей программе, тогда как панель с BoxLayout может отличаться. Я включил другую панель внутри панели BoxLayout с номером GridBagLayout. Всякий раз, когда я добавляю другую панель в BoxLayout, пространство между 1-й строкой и 2-й строкой GridLayout увеличивается.

  1. Может ли кто-нибудь сказать мне, что мне делать, чтобы это не случилось?

  2. Есть ли способ, чтобы radioButton можно было разместить в центре панели?

Вот код:

* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
/** 
* 
* @author arindamchowdhury 
*/ 
public class ScreenTwo { 
    JRadioButton[] radioButton; 


    public ScreenTwo() { 
     start(); 
    } 

    private void start() { 
     JFrame frame = new JFrame(); 
     JPanel panel1 = new JPanel(); 
     frame.getContentPane().add(panel1); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     // Added a panel to the frame with GridLayout. It has 2 rows, and 1 column. 
     panel1.setLayout(new GridLayout(2, 1, 1, 1)); 
     Font font = new Font("Times New Roman", Font.PLAIN, 25); 

     JPanel panel2 = new JPanel(); 
     panel2.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 1)); 

     // *** Making a header section using FlowLayout *** // 
     panel2.add(new JLabel("Flight ID")); 
     panel2.add(new JLabel("Departure")); 
     panel2.add(new JLabel("Arrival")); 
     panel2.add(new JLabel("Total Duration      "));   
     changeFont(panel2, font); 
     panel1.add(panel2); 

     // Making the 2nd row of GridLayout, a BoxLayout, so that components are added vertically. 
     JPanel panel3 = new JPanel(); 
     panel3.setLayout(new BoxLayout(panel3, BoxLayout.Y_AXIS)); 
     panel3.setBorder(BorderFactory.createLineBorder(Color.BLACK));   
     GridBagConstraints c = new GridBagConstraints(); 

     // When I increase comboSize, the space increases 
     int comboSize = 1, i; 
     JPanel panelCombo[] = new JPanel[comboSize]; 
     ButtonGroup group = new ButtonGroup(); 
     radioButton = new JRadioButton[comboSize]; 
     for(i=0; i<comboSize; i++) { 
      panelCombo[i] = new JPanel(); 
      panelCombo[i].setLayout(new GridBagLayout()); 
      c.gridx = 0;    
      c.gridy = 0; 
      c.insets = new Insets(0, 0, 0, 100); 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      c.gridheight = 4; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      // *** Added a RadioButton *** // 
      c.gridx++;   
      radioButton[i] = new JRadioButton(); 
      panelCombo[i].add(radioButton[i]); 
      group.add(radioButton[i]); 

      c.gridheight = 1; 
      c.gridx = 1; 
      c.gridy++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx = 0; 
      c.gridy++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx = 1; 
      c.gridy++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      c.gridx++; 
      panelCombo[i].add(new JLabel("Hi"), c); 

      panel3.add(panelCombo[i]); 
      changeFont(panelCombo[i], font); 
      panelCombo[i].setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
     }    
     panel1.add(panel3); 

     frame.pack(); 
     frame.setVisible(true); 

    } 

    // *** A function to change the font of all components of a container *** // 
    private void changeFont (Component component, Font font) { 
     component.setFont (font); 
     if (component instanceof Container) 
     { 
      for (Component child : ((Container) component).getComponents()) 
      { 
       changeFont (child, font); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     ScreenTwo sc = new ScreenTwo(); 
    } 
} 

Это то, что происходит: This is what's happening

Когда comboSize равно 1: When comboSize is equal to 1

ответ

3

Всякий раз, когда я добавляю другая панель в BoxLayout, пространство между увеличивается 1-я строка и 2-я строка GridLayout.

GridLayout Компоненты панелей верхнего уровня равномерно. Это означает, что верхняя панель с FlowLayout всегда будет иметь такое же пространство, что и нижнюю панель с BoxLayout, который является в сочетании пространства всех GridBagLayout панелей вы положили в

Визуально, vertical space of red panel = vertical space of blue + green + yellow panels:.

enter image description here

Как видите, это не пространство между 1-й и 2-й строками, которые увеличиваются (это пространство 1px, и вы действительно можете его увидеть), это пространство верхней панели.

Если вы хотите, чтобы пространство верхней панели, чтобы оставаться постоянная, вам нужно будет добавить GridBagLayout панелей непосредственно к верхней уровню GridLayout панели без необходимости нижней BoxLayout панели:

gridPanel.setLayout(new GridLayout(0, 1, 1, 1)); 
// ... 
gridPanel.add(topFlowPanel); 
// ... 
for (...) { 
    // ... 
    gridPanel.add(panelCombo[i]); 
    // ... 
} 

enter image description here

Обратите внимание, что вертикальный зазор 1px теперь добавляется между всеми строками.

Есть ли способ, с помощью которого radioButton можно поместить в ЦЕНТР панели?

Если вы имеете в виду центр его вертикально, то вы просто забыли добавить GridBagConstraints при добавлении его к панели:

panelCombo[i].add(radioButton[i], c); 
           ^
+0

Такой хороший, подробное объяснение. Спасибо вам большое за это. Я царапаю голову с утра. У меня просто есть сомнения относительно решения. У 'GridLayout' теперь есть нулевые строки и 1 столбец, поэтому, когда я добавляю к нему 2 панели, почему они не помещаются друг над другом? – Arindam

+1

@Arindam См. [Javadoc on 'GridLayout'] (https://docs.oracle.com/javase/8/docs/api/java/awt/GridLayout.html). если вы не можете найти ответ, я дам вам подсказку. Также подсказка: когда проблемы с компоновкой окрашивают все панели/контейнеры/компоненты по-разному, чтобы вы могли видеть, где находится пространство. – user1803551

+0

Я думаю, что это ответ: один, но не каждый из строк и столбцов может быть равен нулю, а это означает, что «любое количество объектов может быть помещено в строку или в столбец». Не так ли? И спасибо за удобный наконечник, это действительно сэкономит много хлопот. – Arindam