1

Попытка построить об этом GUI в Swing:GridBagLayouts в GridLayout

enter image description here

В моей MainFrame я установил GridLayout как, что для достижения 1 ряд, 2 колонки:

setLayout(new GridLayout(1, 2)); 

В В левой колонке i мне нужен GridBagLayout, как в правой колонке. Обычный GridLayout больше не работает, потому что я хочу разные размеры каждой строки. В левой колонке я пробовал это:

GridBagConstraints gbc = new GridBagConstraints(); 

    mapPanel = new MapPanel(map); 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    gbc.gridheight = 10; 
    add(mapPanel, gbc); 

    controlPanel = new JPanel(); 
    controlPanel.add(new JButton("Test")); 
    controlPanel.add(new JButton("Test 2")); 
    controlPanel.add(new JButton("Test 3")); 
    controlPanel.add(new JButton("Test 4")); 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.gridx = 0; 
    gbc.gridy = 1; 
    gbc.gridheight = 1; 
    add(controlPanel, gbc); 

    logPanel = new LogPanel(); 
    gbc.fill = GridBagConstraints.BOTH; 
    gbc.gridx = 0; 
    gbc.gridy = 2; 
    gbc.gridheight = GridBagConstraints.REMAINDER; 
    add(logPanel, gbc); 

Это, однако, приведет к тому, что все «упаковано вместе» в левом столбце. Он не будет расширяться до 100% высоты и 50% ширины колонки. Как я могу получить графический интерфейс, как на картинке?

Спасибо!

+0

ли вы экспериментировать с 'setPreferredSize (Dimension)' компонентов, которые вы макет? Это свойство тесно связано с тем, как менеджеры макетов приводят результат. –

+0

@HummelingEngineering См. [Следует избегать использования методов набора (Предпочтительный | Максимальный | Минимум) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) –

+0

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

ответ

0

Использование только GridBagLayout будет достаточным.

Установив gbc.gridheight = 10, вы указываете GridBag использовать 10 строк для компонента. (Аналогично rowspan в HTML.) Это, однако, ничего не говорит о фактической высоте компонента, поскольку строки не имеют фиксированной высоты. Следовательно, это ограничение не имеет никакого эффекта, если вы используете только один столбец. Имя ограничения является IMHO запутанным.

Используйте GridBagConstraints.weightx и GridBagConstraints.weighty, чтобы указать, куда следует переместиться. См. How to Use GridBagLayout для получения дополнительной информации.

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

Хотя, как указал Эндрю Томпсон, использование setPreferredSize() - не очень хороший способ. Часто компоненты уже имеют свой предпочтительный размер, просто отлично, как было построено. Просто поиграйте со всеми GridBagConstraints и посмотрите, что произойдет.

В конце концов, это может стать лучшим решением.

2

Посмотрите на JNodeLayout. RectNode - именно то, что вам нужно.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 

import com.smartg.swing.layout.JNodeLayout; 
import com.smartg.swing.layout.LayoutNode.RectNode; 

public class RectNodeDemo { 

    public static void main(String[] args) { 

     String rootName = "root"; 
     RectNode root = new RectNode(rootName); 
     JNodeLayout layout = new JNodeLayout(root); 
     layout.setHgap(1); 
     layout.setVgap(1); 


     JPanel target = new JPanel(); 
     target.setBorder(new EmptyBorder(10, 10, 10, 10)); 

     target.setLayout(layout); 

     addPanel(target, root, new Rectangle2D.Double(0, 0, .5, .5)); 
     addPanel(target, root, new Rectangle2D.Double(0, .5, .5, .1)); 
     addPanel(target, root, new Rectangle2D.Double(0, .6, .5, .4)); 

     addPanel(target, root, new Rectangle2D.Double(.5, 0, .5, .9)); 
     addPanel(target, root, new Rectangle2D.Double(.5, .9, .5, .1)); 

     layout.syncNodes(); 

     JFrame frame = new JFrame(); 

     Container contentPane = frame.getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 
     contentPane.add(target, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    static void addPanel(JPanel target, RectNode node, Rectangle2D r) { 
     JPanel p = new JPanel(); 
     target.add(p); 
     p.setBorder(new LineBorder(Color.BLACK, 1)); 
     node.add(p, r); 
    } 
} 
2

Вы можете использовать Relative Layout. Этот макет позволяет указать относительные размеры каждого компонента.

Чтобы создать панель на левой стороне кода будет что-то вроде:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS); 
rl.setFill(true); 
JPanel left = new JPanel(rl); 
left.add(panel1, new Float(50)); 
left.add(panel2, new Float(10)); 
left.add(panel3, new Float(40));