如何在 Java Swing 中动态控制自动调整大小的组件1. 全屏图形用户界面2.小水平调整大小3. 最小水平尺寸

2022-09-02 10:17:51

在Java(1.8)Swing中创建新的GUI,我正在寻找一种方法来覆盖所有组件的大小调整行为。

让我用一些编辑过的照片向你解释:

1. 全屏图形用户界面

这是我的全屏GUI,有3个面板和一个.绿色的一个需要有一个固定的大小,其他的将是可调整的JToolBar

目前,我只有2个小来组织它们(一个垂直,一个水平用于绿色和青色面板)。GridLayout

FullScreen GUI

2.小水平调整大小

例如,如果我从右侧减小框架大小,我希望根据新的框架大小调整蓝色和青色面板的大小。但绿色面板必须固定。(我认为这不是最困难的部分。

Resized once GUI

3. 最小水平尺寸

这对我来说是最困难的部分。一旦青色(或蓝色)面板达到最小尺寸,我希望他将绿色面板“”到左侧,即使它从框架上消失了。

当然,将框架向右拉将使绿色面板再次出现。

Minimum size of the GUI

我该怎么做?

我想过使用或特定的侦听器手动决定调整大小的行为,但我需要一些建议。JSplitPane

很抱歉,如果现有帖子可以回答这个问题,我没有找到任何为我解释这个问题的答案。

提前致谢!


如果你想要更多的例子,看看“Evernote”软件,它的行为方式相同


答案 1

设置面板的最大/最小/首选大小可以在第一个条件下使该面板保持相同的大小。要检查大小调整,您可以在另一个上使用 - 如果大小低于特定宽度,则更改面板的最大/最小/首选大小。GreenComponentListenerJPanelGreen

下面是一个被黑客攻击在一起的示例 - 当 < 600 时,它会调整面板的大小,并且调整大小是加权调整大小(总宽度的 30%)。为了获得真正的L&F和你想要的,你可能不得不玩布局/尺寸。GreenBlue

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;


public class GridTest extends JPanel{

    private boolean changeAllowed = false;
    //keep reference to cyan for the height dimension
    final JPanel cyan = new JPanel();

    public GridTest(){
        cyan.setPreferredSize(new Dimension(600, 300));//provide sizing hint
    }

    private Dimension getCustomDimensions(){
        if ( changeAllowed ){
            return new Dimension((int)(super.getParent().getBounds().width * 0.3), cyan.getBounds().height);
        }else{
            return new Dimension(200, cyan.getBounds().height);
        }
    }
    @Override
    public Dimension getMaximumSize(){
        return getCustomDimensions();
    }
    @Override
    public Dimension getMinimumSize(){
        return getCustomDimensions();
    }
    @Override
    public Dimension getPreferredSize(){
        return getCustomDimensions();
    }

    public static void main(String[] args) throws Exception{
        SwingUtilities.invokeAndWait(new Runnable(){

            @Override
            public void run() {
                final int MINIMUM = 600;
                JFrame frame = new JFrame();
                frame.add(new JToolBar(), BorderLayout.NORTH);
                final JPanel blue = new JPanel();

                final GridTest green = new GridTest();
                green.setBackground(Color.green);
                green.setOpaque(true);

                green.cyan.setBackground(Color.cyan);
                green.cyan.setOpaque(true);
                blue.setOpaque(true);
                blue.setBackground(Color.blue);
                blue.setPreferredSize(new Dimension(900, 300));//hint at size
                blue.setMinimumSize(new Dimension(100, 200));//hint at size
                //Nest Box Layouts
                Box top = Box.createHorizontalBox();
                top.add(blue);
                Box bottom = Box.createHorizontalBox();
                bottom.add(green);
                bottom.add(green.cyan);
                Box vert = Box.createVerticalBox();
                vert.add(top);
                vert.add(bottom);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(vert);
                //listen for resizes
                blue.addComponentListener(new ComponentAdapter(){

                    @Override
                    public void componentResized(ComponentEvent e) {
                        if ( blue.getBounds().width < MINIMUM ){//set flag
                            green.changeAllowed = true;
                        }else{
                            green.changeAllowed = false;
                        }
                    }
                });

                frame.pack();
                frame.setSize(800, 600);
                frame.setVisible(true);

            }

        });
    }
}

答案 2

这就是我这样做的方式,我不确定这是正确的方法:

首先将布局设置为 null。

接下来,为框架创建一个组件大小调整事件:

addComponentListener(new ComponentAdapter(){
            public void componentResized(ComponentEvent e){
            }
        });

在这里,您可以在调整组件大小时手动更改组件。我已经为我的一些程序执行此操作,以保持框架左侧和右侧的滚动窗格始终具有相同的宽度,并使其他所有内容的大小都随着调整大小而上下调整。