Java FlowLayout внутри FlowLayout - PullRequest
       17

Java FlowLayout внутри FlowLayout

0 голосов
/ 08 сентября 2018

Я пытаюсь сделать дизайн похожим на строку заголовка браузера (вверху браузера). На левой стороне расположены вкладки, а на правой - сворачивание, изменение размера (сворачивание / разворачивание), кнопка выхода.

Для этого я пытался, как.

JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
JPanel tabpanel= new JPanel();
tabpanel.setLayout(new  FlowLayout(FlowLayout.LEFT));
tabpanel.add(new JButton("Tab 1"));
tabpanel.add(new JButton("Tab 2"));
panel.add(tabpanel); 
panel.add(new JButton("Minimize")); 
panel.add(new JButton("Resize")); 
panel.add(new JButton("Quit")); 

Созданы кнопки «Выйти», «Изменить размер», «Свернуть» справа, если это необходимо, но вкладки, созданные рядом с кнопкой «Свернуть», не ВЛЕВО кадра. Я думаю, что должен быть метод или что-нибудь, чтобы заполнить его оставшимся контентом или я должен использовать другой макет? Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Как предлагается в комментариях: одним из решений может быть размещение «вкладок» и «кнопок» в отдельных панелях и добавление их в WEST и EAST титульной панели, которая имеет BorderLayout :

Title bar layout

Вот MCVE:

import java.awt.BorderLayout;
import java.awt.FlowLayout;

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

public class TitleBarLayout
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui()
    {
        JFrame f = new JFrame();
        JPanel mainPanel = new JPanel(new BorderLayout());

        JPanel titleBar = new JPanel(new BorderLayout());

        JPanel tabPanel = new JPanel();
        tabPanel.setLayout(new FlowLayout());
        tabPanel.add(new JButton("Tab 1"));
        tabPanel.add(new JButton("Tab 2"));
        titleBar.add(tabPanel, BorderLayout.WEST);

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(new JButton("Minimize"));
        buttonsPanel.add(new JButton("Resize"));
        buttonsPanel.add(new JButton("Quit"));
        titleBar.add(buttonsPanel, BorderLayout.EAST);

        mainPanel.add(titleBar, BorderLayout.NORTH);

        f.getContentPane().add(mainPanel);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
0 голосов
/ 09 сентября 2018

Я бы настоятельно рекомендовал GridBagLayout, это один из самых гибких и настраиваемых доступных менеджеров компоновки, но он приносит с собой сложность

GridBagLayout

public class HeaderPane extends JPanel {

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

        add(new JButton("Tab 1"));
        add(new JButton("Tab 2"));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.anchor = GridBagConstraints.BASELINE_TRAILING;

        add(new JButton("Minimize"), gbc);
        add(new JButton("Maximise"));
        add(new JButton("Close"));          
    }

}

Arrgggh, горит сложность, горит 101 сарказм

Итак, это решение представляет собой один контейнер с одним менеджером компоновки. Я не говорю, что более сложное требование может выиграть от составного решения (я бы соблазнил поместить кнопки min / max / close и tab в свои собственные контейнеры), но в качестве отправной точки это относительно просто.

Пример выполнения

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
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 HeaderPane(), BorderLayout.NORTH);
                frame.add(new JPanel() { 
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(600, 200);
                    }                   
                });
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class HeaderPane extends JPanel {

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

            add(new JButton("Tab 1"));
            add(new JButton("Tab 2"));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = 1;
            gbc.anchor = GridBagConstraints.BASELINE_TRAILING;

            add(new JButton("Minimize"), gbc);
            add(new JButton("Maximise"));
            add(new JButton("Close"));          
        }

    }

}
0 голосов
/ 08 сентября 2018

Я предлагаю использовать BoxLayout в качестве менеджера компоновки panel для организации левой и правой части.

Полный демонстрационный код ниже:

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

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(()->{
            JFrame frame = new JFrame("Solution");
            JPanel container = new JPanel();
            container.setLayout(new BorderLayout());

            JPanel panel = new JPanel();
            panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
            JPanel tabpanel= new JPanel();
            tabpanel.setLayout(new  FlowLayout(FlowLayout.LEFT));
            tabpanel.add(new JButton("Tab 1"));
            tabpanel.add(new JButton("Tab 2"));
            panel.add(tabpanel);
            panel.add(new JButton("Minimize"));
            panel.add(new JButton("Resize"));
            panel.add(new JButton("Quit"));

            container.add(panel, BorderLayout.PAGE_START);
            frame.add(container);
            frame.pack();
            frame.setSize(new Dimension(500,500));
            frame.setVisible(true);
        });
    }
}

Как это выглядит:

enter image description here

...