java swing调整大小

java swing调整大小,swing,resize,Swing,Resize,我正在写一个库,在那里我被传递到一个容器中(通常是JPanel) 并为不同的控件、它们的位置、大小和其他属性提供xml规范。我必须在运行时创建这些控件并将其添加到组件中。处理父容器大小调整的好方法是什么 如果XML指定了绝对位置,则可能无法优雅地调整组件的大小。您可以创建一个自定义的LayoutManager来线性扩展它们,但这对于大多数组件来说可能是不好的 编辑:以下是一个可能有用的版本: public class LinearScaleLayout { public static v

我正在写一个库,在那里我被传递到一个容器中(通常是JPanel)


并为不同的控件、它们的位置、大小和其他属性提供xml规范。我必须在运行时创建这些控件并将其添加到组件中。处理父容器大小调整的好方法是什么

如果XML指定了绝对位置,则可能无法优雅地调整组件的大小。您可以创建一个自定义的LayoutManager来线性扩展它们,但这对于大多数组件来说可能是不好的

编辑:以下是一个可能有用的版本:

public class LinearScaleLayout {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Linear Scale Layout Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 200, 200);

        JPanel scalePanel = new JPanel(new LinearScaleLayoutManager());
        scalePanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        scalePanel.add(new JTextField(), new Rectangle2D.Double(0, 0, 1, 0.2));
        scalePanel.add(new JScrollPane(new JEditorPane()), new Rectangle2D.Double(0, 0.25, 0.45, 0.75));
        scalePanel.add(new JSlider(), new Rectangle2D.Double(0.55, 0.25, 0.45, 0.75));

        frame.getContentPane().add(scalePanel);
        frame.setVisible(true);
    }

    private static class LinearScaleLayoutManager implements LayoutManager2 {
        private final HashMap<Component, Rectangle2D> rectMap = new HashMap<Component, Rectangle2D>();

        @Override
        public void layoutContainer(Container parent) {
            synchronized (parent.getTreeLock()) {
                Insets insets = parent.getInsets();
                int clientWidth = parent.getWidth() - insets.left - insets.right;
                int clientHeight = parent.getHeight() - insets.top - insets.bottom;
                if (clientWidth > 0 && clientHeight > 0) {
                    for (Component component : parent.getComponents()) {
                        Rectangle2D rect = rectMap.get(component);
                        if (rect != null) {
                            component.setBounds(new Rectangle(insets.left + (int)(rect.getX() * clientWidth), 
                                    insets.top + (int)(rect.getY() * clientHeight), (int)(rect.getWidth() * clientWidth), 
                                    (int)(rect.getHeight() * clientHeight)));
                        }
                    }
                }
            }
        }

        @Override
        public void addLayoutComponent(Component comp, Object constraints) {
            rectMap.put(comp, (Rectangle2D)constraints);
        }

        @Override
        public void removeLayoutComponent(Component comp) {
            rectMap.remove(comp);
        }

        @Override
        public Dimension minimumLayoutSize(Container parent) {
            return new Dimension(0, 0);
        }

        @Override
        public Dimension preferredLayoutSize(Container parent) {
            return new Dimension(100, 100);
        }

        @Override
        public Dimension maximumLayoutSize(Container target) {
            return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
        }

        @Override
        public void addLayoutComponent(String name, Component comp) {
        }

        @Override
        public float getLayoutAlignmentX(Container target) {
            return 0;
        }

        @Override
        public float getLayoutAlignmentY(Container target) {
            return 0;
        }

        @Override
        public void invalidateLayout(Container target) {
        }
    }
}
公共类LinearScaleLayout{
公共静态void main(字符串[]args){
JFrame=新JFrame(“线性比例布局测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架.立根(100100200200);
JPanel scalePanel=newjpanel(newlinearscaleLayoutManager());
scalePanel.setBorder(新的空序(5,5,5,5));
添加(新的JTextField(),新的Rectangle2D.Double(0,0,1,0.2));
添加(新的JScrollPane(新的JEditorPane()),新的Rectangle2D.Double(0,0.25,0.45,0.75));
添加(新的JSlider(),新的Rectangle2D.Double(0.55,0.25,0.45,0.75));
frame.getContentPane().add(scalePanel);
frame.setVisible(true);
}
私有静态类LinearScaleLayoutManager实现LayoutManager2{
private final HashMap rectMap=new HashMap();
@凌驾
公共无效布局容器(容器父级){
已同步(父级.getTreeLock()){
Insets Insets=parent.getInsets();
int clientWidth=parent.getWidth()-insets.left-insets.right;
int clientHeight=parent.getHeight()-insets.top-insets.bottom;
if(clientWidth>0&&clientHeight>0){
对于(组件:parent.getComponents()){
Rectangle2D rect=rectMap.get(组件);
if(rect!=null){
setBounds(新矩形(insets.left+(int)(rect.getX()*clientWidth),
insets.top+(int)(rect.getY()*clientHeight),(int)(rect.getWidth()*clientWidth),
(int)(rect.getHeight()*clientHeight));
}
}
}
}
}
@凌驾
public void addLayoutComponent(组件组件、对象约束){
放置(comp,(Rectangle2D)约束);
}
@凌驾
公共void removeLayoutComponent(组件组件组件){
rectMap.remove(comp);
}
@凌驾
公共维度minimumLayoutSize(容器父级){
返回新维度(0,0);
}
@凌驾
公共维度preferredLayoutSize(容器父级){
返回新维度(100100);
}
@凌驾
公共维度maximumLayoutSize(容器目标){
返回新维度(Integer.MAX\u值、Integer.MAX\u值);
}
@凌驾
public void addLayoutComponent(字符串名称,组件组成){
}
@凌驾
公共浮点getLayoutAlignmentX(容器目标){
返回0;
}
@凌驾
公共浮点GetLayoutAlignment(容器目标){
返回0;
}
@凌驾
public void invalidateLayout(容器目标){
}
}
}