Kap*_*ash 13 java user-interface swing resize autoresize
用Java创建一个新的GUI(1.8)Swing,我正在寻找一种方法来覆盖所有组件的resize行为.
让我用一些编辑过的照片向你解释:
这是我的全屏GUI,有3个面板和一个JToolBar.绿色的需要具有固定的大小,其他的可以调整大小.
目前,我只有2个小GridLayout组织它们(一个垂直,一个水平绿色和青色面板).

例如,如果我从右侧缩小框架尺寸,我希望根据新的框架尺寸调整蓝色和青色面板的大小.但必须修复绿色面板.(这不是我认为最困难的部分.)

这对我来说是最困难的部分.一旦青色(或蓝色)面板达到最小尺寸,我希望他将绿色面板" 推 "到左侧,即使它从框架上消失.
当然,将框架向右拉,将使绿色面板再次出现.

我怎么能这样做?
我想使用JSplitPane或特定的监听器手动决定调整大小行为,但我需要一些建议.
对不起,如果现有的帖子可以回答这个问题,我没有找到任何答案来解释这个问题.
提前致谢!
如果您想要更多示例,请查看"Evernote"软件,该软件的行为方式相同
设置Green面板的最大/最小/首选大小可以使该面板在第一个条件下保持相同的大小.要检查调整大小,则可以使用一个ComponentListener在另一个的一个JPanel的-如果尺寸变特定宽度低于然后改变最大/最小/优选的的尺寸Green面板.
下面是一个黑客攻击的例子 - Green当Blue它<600 时调整面板的大小,调整大小是一个加权调整大小(总宽度的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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39408 次 |
| 最近记录: |