首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何动态控制Java Swing中的自动调整组件

如何动态控制Java Swing中的自动调整组件
EN

Stack Overflow用户
提问于 2015-05-12 18:38:30
回答 5查看 65.7K关注 0票数 20

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

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

1.全屏GUI

这是我的全屏图形用户界面,有3个面板和一个JToolBar。绿色的需要有一个固定大小的,其他的是可调整大小的

目前,我只有两个小的GridLayout来组织他们(一个垂直的,一个水平的绿色和青色面板)。

2.小型水平调整尺寸

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

3.最低水平尺寸

这对我来说是最困难的部分。一旦青色(或蓝色)面板达到最小大小,我希望他"push“绿色面板左边,即使它消失在框架上。

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

我怎么能做到呢?

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

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

提前感谢!

如果您想要更多的例子,请看"Evernote“软件,它的作用是相同的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-05-12 19:56:40

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

下面是这样做的一个合并示例--当Green < 600时,它调整Blue面板的大小,而调整大小是加权调整大小(占总宽度的30%)。要得到真正的L&F和你想要的,你可能必须玩的布局/大小。

代码语言:javascript
运行
复制
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);

            }

        });
    }
}
票数 12
EN

Stack Overflow用户

发布于 2015-05-12 19:10:13

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

首先,将布局设置为空。

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

代码语言:javascript
运行
复制
addComponentListener(new ComponentAdapter(){
            public void componentResized(ComponentEvent e){
            }
        });

在这里,您可以手动更改组件的大小。我这样做的几个程序,以保持一个滚动窗格的左和右的框架,始终相同的宽度,并使其他大小上下调整。

票数 4
EN

Stack Overflow用户

发布于 2015-05-12 19:10:23

对于GridBagLayout来说,这应该很容易,前提是为绿色和青色组件设置合适的最小尺寸:

代码语言:javascript
运行
复制
setLayout(new GridBagLayout());
green.setMnimumSize(new Dimension(0, 0));
cyan.setMinimumSize(new Dimension(100, 100)); // whatever fits
add(blue, new GridBagConstraints(0, 0, 2, 1,
        1.0, 0.0,
        GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
        new Insets(0, 0, 0, 0), 0, 0);
add(green, new GridBagConstraints(0, 1, 1, 1,
        0.0, 0.0,
        GridBagConstraints.WEST, GridBagConstraints.NONE,
        new Insets(0, 0, 0, 0), 0, 0);
add(cyan, new GridBagConstraints(1, 1, 1, 1,
        1.0, 0.0,
        GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
        new Insets(0, 0, 0, 0), 0, 0);

通过为青色和蓝色组件指定权重x,以及设置resize =横向,它们将与容器一起调整大小。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30198953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档