Центрирующие и плавающие элементы в Swing - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь достичь двух вещей: иметь один элемент по горизонтали по центру в JPanel и один элемент, плавающий на правом краю панели. Когда размер окна изменяется, центрированный элемент остается в центре панели, а плавающий прилипает к правому краю.

Это не кажется сложной проблемой, но я не могу сделать элементы играют хорошо. Достаточно легко оставить красный элемент в центре белого пространства, оставшегося от поплавка, но сохранение его в фактическом центре окна поставило меня в тупик.

Simple demonstration of what I'm trying to achieve

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Достаточно легко оставить красный элемент в центре белого пространства, оставшегося от поплавка, но сохранение его в самом центре окна поставило меня в тупик.

Самый простой способ, как я могу это сделать, - иметь область "заполнителя" на левой стороне, равную ширине компонента на правой стороне.

Вы можете сделать это несколькими разными способами :

  1. Добавить Box.createHorizontalStrut (…)
  2. Добавить EmptyBorder на панель.

Таким образом, код может выглядеть примерно так:

int width = rightComponent.getPreferredSize().width;

JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel, BoxLayout.X_AXIS) );
panel.setBorder( new EmptyBorder(0, width, 0, 0) );  
//panel.add( Box.createHorizontalStrut(width); // or use a filler component
panel.add( Box.createHorzontalGlue() );
panel.add( centerComponent );
panel.add( Box.createHorizontalGlue() );
panel.add( rightComponent );
0 голосов
/ 20 июня 2020

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

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

public class Example {

    private final int hGap = 5;
    private final int vGap = 5;

    private GridBagConstraints gbc;

    public Example () {
        gbc = new GridBagConstraints ();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;   
        gbc.insets = new Insets ( hGap, vGap, hGap, vGap ); 
    }

    private void createAndDisplayGUI () {
        JFrame frame = new JFrame ( "Example" );
        frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );

        JPanel contentPane = new JPanel ();
        contentPane.setLayout ( new BorderLayout ( hGap, vGap ) );

        JPanel gridBagPanel = new JPanel( new GridBagLayout () );
        gridBagPanel.setBorder (
            BorderFactory.createTitledBorder ( "GridBagLayout" ) );
        gridBagPanel.setOpaque ( true );
        gridBagPanel.setBackground ( Color.WHITE );
        JPanel leftPanel = new JPanel ();
        leftPanel.setOpaque ( true );
        leftPanel.setBackground ( Color.red );
        addComp ( gridBagPanel, leftPanel, 0, 0, 1, 1
                            , GridBagConstraints.BOTH, 0.33, 1.0 );

        JPanel centerPanel = new JPanel ();
        centerPanel.setOpaque ( true );
        centerPanel.setBackground ( Color.blue );

        addComp ( gridBagPanel, centerPanel, 1, 0, 1, 1
                            , GridBagConstraints.BOTH, 0.33, 1.0 );

        JPanel leftLeftPanel = new JPanel ();
        leftLeftPanel.setOpaque ( true );
        leftLeftPanel.setBackground ( Color.white );

        addComp ( gridBagPanel, leftLeftPanel, 2, 0, 1, 1
                            , GridBagConstraints.BOTH, 0.165, 1.0 );

        JPanel rightPanel = new JPanel ();
        rightPanel.setOpaque ( true );
        rightPanel.setBackground ( Color.green );

        addComp ( gridBagPanel, rightPanel, 3, 0, 1, 1
                            , GridBagConstraints.BOTH, 0.165, 1.0 );
        contentPane.add ( gridBagPanel, BorderLayout.CENTER );

        frame.setContentPane ( contentPane );
        frame.pack ();
        frame.setLocationByPlatform ( true );
        frame.setVisible ( true );
    }

    private void addComp ( JPanel panel, JComponent comp
                                , int x, int y, int gWidth
                                    , int gHeight, int fill
                                        , double weightx, double weighty ) {
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = gWidth;
        gbc.gridheight = gHeight;
        gbc.fill = fill;
        gbc.weightx = weightx;
        gbc.weighty = weighty;      

        panel.add ( comp, gbc );
    }

    public static void main ( String [] args ) {
        EventQueue.invokeLater ( new Runnable () {
            @Override
            public void run () {
                new Example ().createAndDisplayGUI ();
            }
        } );
    }
} 

OUTPUT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...