其他分享
首页 > 其他分享> > 如何防止Boxlayout / Box拉伸儿童组件?

如何防止Boxlayout / Box拉伸儿童组件?

作者:互联网

正如您在下面的可运行代码中所看到的,我尝试使用具有可扩展子框的Box.儿童盒可以改变它们的大小,这一切都很好.主要问题是大小始终相对于父级.但我希望它们具有特定的大小,以防万一没有地方使用JScrollPane.目前他们只收缩其他儿童盒子.

我尝试了Glue和Filler,但它没有用.胶水没有任何效果,填料具有副作用,始终保持一定的位置(即使ScrollPane正在运行).拥有如此多的自由空间是非常难看的.

所以,你知道防止盒子伸展孩子的好方法吗?

先感谢您!

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;


public class ExpandableMenueDemo {
    Box allBoxes; 
    ExpandableMenueDemo(){
        allBoxes = Box.createVerticalBox();

        TitledBorder title;
        title = BorderFactory.createTitledBorder("Filter");
        allBoxes.setBorder(title);

        for (int i = 0 ;i<3;i++){
            //generate collapsable components
            SubBox b = new SubBox("SubBox"+i);
            allBoxes.add(b.getSwingBox());

        }
        allBoxes.add(Box.createVerticalGlue());
    }

    public Container getMenue(){
        return allBoxes;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        ExpandableMenueDemo m = new ExpandableMenueDemo();
        Box mainBox = Box.createHorizontalBox();

        mainBox.add(new JScrollPane(m.getMenue()));
        mainBox.add(new JTable(20,5));

        frame.setContentPane(mainBox);
        frame.pack();
        frame.setVisible(true);
    }


    class SubBox{
        Box box;
        Box header; 
        String name; 
        JButton cBtn;
        boolean isCollapsed = true;
        JLabel headerLine; 

        SubBox(String name) {
            this.name= name;
            box = Box.createVerticalBox();

            headerLine = new JLabel(name+" () :");

            header= Box.createHorizontalBox();
            cBtn = new JButton("v");
            cBtn.addActionListener(new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    if (isCollapsed)show();
                    else collapse();
                }
            });
            collapse();

            header.add(cBtn);
            header.add(Box.createHorizontalStrut(10));
            header.add(headerLine);
            header.add(Box.createHorizontalGlue());

        }

        Box getSwingBox() {
            Box b = Box.createVerticalBox();    
            b.add(header);
            b.add(box);
            return b;
        }

        public void collapse(){
            System.out.println("collapse");
            box.removeAll();
            this.isCollapsed=true;
            cBtn.setText("v");
        }

        public void show(){
            System.out.println("show");
            box.removeAll();
            this.isCollapsed=false;
            cBtn.setText("^");

            for (int i = 0; i<3;i++) { 
               Box b = Box.createHorizontalBox();
               b.add(Box.createHorizontalStrut(20));
               b.add(new JCheckBox("checkBox "+i));
               b.add(Box.createHorizontalGlue());
               box.add(b);
            }
        }
    }
}

解决方法:

您可以考虑使用SwingX中包含的JXTaskPane / -Container而不是重新发明轮子.它的demo在左侧显示它的运行(作为taskPanes) – 这是选择演示的部分.

标签:boxlayout,java,swing
来源: https://codeday.me/bug/20191001/1839858.html