gpt4 book ai didi

java - 如何在 Java Swing 中动态控制自动调整大小的组件

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:13 24 4
gpt4 key购买 nike

在 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”软件

最佳答案

设置 Green 面板的最大/最小/首选大小可以使该面板在第一种情况下保持相同大小。要检查调整大小,您可以在其他 JPanel 之一上使用 ComponentListener - 如果大小低于特定宽度,则更改最大/最小/首选大小Green 面板的。

下面是一个混合在一起的例子——它在 Blue < 600 时调整 Green 面板的大小,并且调整大小是加权调整大小(30%总宽度)。要获得真正的 L&F 和您想要的,您可能需要调整布局/尺寸。

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);

}

});
}
}

关于java - 如何在 Java Swing 中动态控制自动调整大小的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com