Изменяемый размер Swing с кнопками, расположенными в соответствии с различными размерами - PullRequest
2 голосов
/ 20 мая 2011

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

эскиз макета http://tobias.braun -abstatt.de / files / forums / buttons_sketch.png

Слева находится JPanel, который рисуется через paintComponent() таким образом, что графика автоматически масштабируется при изменении размера окна.(Вопрос не об этой панели. Это уже сделано.)

Теперь мне нужны некоторые кнопки (черные рамки, добавленные в Photoshop для рисования) справа от упомянутой ранее JPanel.Высота красноватых областей сверху и снизу, рядом с которыми должно быть только пустое пространство, рассчитывается по линиям CONSTANT_FACTOR * getHeight().Рядом с каждым отсеком слева должна быть группа кнопок, выстроенных в линию к центру соответствующего отсека (см. Синие линии).

JPanel, содержащая кнопки, знает о CONSTANT_FACTOR и числеотсеков, так что должна быть возможность передать эту информацию в менеджер раскладки.

Какой менеджер раскладки я бы лучше всего использовал для достижения этого раскладки?Я читал обо всех разных менеджерах компоновки, но не могу понять, какая из них или какая комбинация лучше всего подходит в этом случае.

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

Например, при использовании другого LayoutManager , очень простого и простого контейнера, требуется не более 15-20 минут:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ThinLineFrame {
    private JFrame frame = new JFrame();
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private JPanel panelNorth = new JPanel();
    private JPanel panelCenter = new JPanel();
    private JPanel panelCenterCh1 = new JPanel();
    private JPanel panelCenterCh2 = new JPanel();
    private JPanel panelCenterCh3 = new JPanel();
    private JPanel panelCenterCh4 = new JPanel();
    private JPanel panelCenterCh5 = new JPanel();
    private JPanel panelSouth = new JPanel();

    public ThinLineFrame() {
        panelNorth.setBackground(Color.red.darker());
        panelNorth.setPreferredSize(new Dimension(80, 30));
        //
        panelCenter.setBackground(Color.darkGray);
        panelCenter.setLayout(new GridLayout(5, 1, 2, 2));
        //
        panelCenterCh1.setLayout(new BorderLayout());
        JButton panelCenterCh1Button = new JButton();
        panelCenterCh1.add(panelCenterCh1Button, BorderLayout.CENTER);
        //
        JButton panelCenterCh2Button1 = new JButton();
        JButton panelCenterCh2Button2 = new JButton();
        panelCenterCh2.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh2.add(panelCenterCh2Button1);
        panelCenterCh2.add(panelCenterCh2Button2);
        //
        JButton panelCenterCh3Button1 = new JButton();
        JButton panelCenterCh3Button2 = new JButton();
        panelCenterCh3.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh3.add(panelCenterCh3Button1);
        panelCenterCh3.add(panelCenterCh3Button2);
        //
        JButton panelCenterCh4Button1 = new JButton();
        JButton panelCenterCh4Button2 = new JButton();
        panelCenterCh4.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh4.add(panelCenterCh4Button1);
        panelCenterCh4.add(panelCenterCh4Button2);
        //
        panelCenterCh5.setLayout(new BorderLayout());
        JButton panelCenterCh5Button = new JButton();
        panelCenterCh5.add(panelCenterCh5Button, BorderLayout.CENTER);
        //
        panelCenter.add(panelCenterCh1);
        panelCenter.add(panelCenterCh2);
        panelCenter.add(panelCenterCh3);
        panelCenter.add(panelCenterCh4);
        panelCenter.add(panelCenterCh5);
        //
        panelSouth.setBackground(Color.red.darker());
        panelSouth.setPreferredSize(new Dimension(80, 30));
        //
        panel.setLayout(new BorderLayout(2, 2));
        panel.add(panelNorth, BorderLayout.NORTH);
        panel.add(panelCenter, BorderLayout.CENTER);
        panel.add(panelSouth, BorderLayout.SOUTH);
        //
        scrollPane = new JScrollPane(panel);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(80, 600));
        frame.setLocation(100, 150);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ThinLineFrame dlg = new ThinLineFrame();
            }
        });
    }
}
2 голосов
/ 20 мая 2011

Вы должны попробовать посмотреть на MigLayout.Это очень гибкий LayoutManager, который также очень прост.

Код будет выглядеть примерно так:

MigLayout layout = new MigLayout("flowy");
panel.setLayoutManager(layout);
panel.add(button1);
panel.adD(button2);
etc..

Попробуйте добавить отладчик flowy в конструктор, чтобы получить наглядное представление о происходящем.

1 голос
/ 21 мая 2011

GBC без якоря, просто с простым ванильным GridBagConstraints и предпочтительным размером.

Центрированный JButton с фиксированным размером:

import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MainWithFixSize {
    public static void main(String[] argv) throws Exception {
        JFrame frame = new JFrame();
        Container container = frame.getContentPane();
        GridBagLayout gbl = new GridBagLayout();
        container.setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 1;
        JButton component = new JButton();
        component.setPreferredSize(new Dimension(25, 25));
        gbl.setConstraints(component, gbc);
        container.add(component);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(40, 90));
        frame.pack();
        frame.setVisible(true);
    }

    private MainWithFixSize() {
    }
}
...