Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组件可以动态添加到GroupLayout中的组中吗?_Java_Swing_Layout Manager_Grouplayout - Fatal编程技术网

Java 组件可以动态添加到GroupLayout中的组中吗?

Java 组件可以动态添加到GroupLayout中的组中吗?,java,swing,layout-manager,grouplayout,Java,Swing,Layout Manager,Grouplayout,调用setHorizontalGroup()和setVerticalGroup()后,是否可以将组件动态添加到GroupLayout中的组中,而不必重置布局?我正在做一个GUI项目,它将帮助学生找到最好的方法来安排他们的每周课程表。这涉及到为未知数量的课程输入有关上课时间等的信息。当然,我不能只是添加任意数量的表单供用户输入信息,并说“没有人可以考虑超过这个数量的类”,因此用户需要能够自己添加新表单。我可以创建表单,但是如果不重新调用setHorizontalGroup(…)或setVertic

调用
setHorizontalGroup()
setVerticalGroup()
后,是否可以将
组件
动态添加到
GroupLayout
中的组中,而不必重置布局?我正在做一个GUI项目,它将帮助学生找到最好的方法来安排他们的每周课程表。这涉及到为未知数量的课程输入有关上课时间等的信息。当然,我不能只是添加任意数量的表单供用户输入信息,并说“没有人可以考虑超过这个数量的类”,因此用户需要能够自己添加新表单。我可以创建表单,但是如果不重新调用
setHorizontalGroup(…)
setVerticalGroup(…)
,我找不到任何方法将它们成功添加到窗口中的
GroupLayout
,而不是添加到它们。 这是我目前拥有的代码的相关部分(注释清晰):

我尝试在
frame.pack()
之前调用
frame.add([some component])
,但它从未产生任何明显的区别。我已经查看了GroupLayout的官方文档,我看不到任何方法可以访问或更改
GroupLayout
中的水平/垂直
组,或者甚至是引用这些
组的字段。
我完全不知道在这里该怎么办。如果可能的话,我想避免学习一种新类型的
布局,但我开始担心我将不得不学习(或者,更糟糕的是,我试图做的事情是不可能开始的)。

如图所示,您可以使用这种方法:

  • 首先,创建所需的
    并行组
    顺序组
  • 稍后,添加表示新行的所需组和组件
  • 在下面的示例中,
    add()
    将新标签和文本字段追加到布局中。建议使用一个
    AdjustmentListener
    ,滚动到最后添加的行

    导入java.awt.BorderLayout;
    导入java.awt.Dimension;
    导入java.awt.EventQueue;
    导入java.awt.event.ActionEvent;
    导入java.awt.event.AdjustmentEvent;
    导入javax.swing.AbstractAction;
    导入javax.swing.GroupLayout;
    导入javax.swing.JButton;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    导入javax.swing.JScrollPane;
    导入javax.swing.JTextField;
    /**
    *@见https://stackoverflow.com/a/41926375/230513
    *@见https://stackoverflow.com/a/14858272/230513
    *@见https://stackoverflow.com/a/8504753/230513
    *@见https://stackoverflow.com/a/14011536/230513
    */
    公共类动态组布局{
    私有静态final int NUM=6;
    私人集团布局;
    private GroupLayout.parallel组parallel;
    private GroupLayout.SequentialGroup SequentialGroup SequentialGroup;
    私人互联网i;
    私有JPanel create(){
    JPanel面板=新的JPanel();
    布局=新的组布局(面板);
    面板设置布局(布局);
    layout.setAutoCreateGaps(真);
    layout.setAutoCreateContainerGaps(真);
    parallel=layout.createParallelGroup();
    layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(parallel));
    sequential=layout.createSequentialGroup();
    布局。设置垂直组(顺序);
    for(int i=0;i{
    e、 getAdjustable().setValue(例如getAdjustable().getMaximum());
    });
    f、 添加(jsp);
    JPanel controls=新的JPanel();
    add(newjbutton)(newabstractAction(“add”){
    @凌驾
    已执行的公共无效操作(操作事件e){
    dgl.add();
    panel.validate();
    }
    }));
    f、 添加(控件,BorderLayout.SOUTH);
    f、 包装();
    f、 setLocationRelativeTo(空);
    f、 setVisible(真);
    }
    });
    }
    }
    
    如图所示,您可以使用以下方法:

  • 首先,创建所需的
    并行组
    顺序组
  • 稍后,添加表示新行的所需组和组件
  • 在下面的示例中,
    add()
    将新标签和文本字段追加到布局中。建议使用一个
    AdjustmentListener
    ,滚动到最后添加的行

    导入java.awt.BorderLayout;
    导入java.awt.Dimension;
    导入java.awt.EventQueue;
    导入java.awt.event.ActionEvent;
    导入java.awt.event。
    
     private static void createAndShowGUI() {
        //Create window and assign an empty GroupLayout to it
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GroupLayout layout = new GroupLayout(frame.getContentPane());
        frame.getContentPane().setLayout(layout);
    
        /*WeekPanel extends JPanel, and is the "form" the user enters data into. 
        In essence, it's a JPanel with a series of JTextFields.*/
        WeekPanel panel1 = new WeekPanel();
        WeekPanel panel2 = new WeekPanel();
    
        //The layout code below places two WeekPanels in the window, one on top of the other
        layout.setHorizontalGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup()
                        .addComponent(panel1)
                        .addComponent(panel2)));
        layout.setVerticalGroup(layout.createSequentialGroup()
                .addComponent(panel1)
                .addComponent(panel2));
    
        /*I would like to add a component to the layout here as proof of concept.*/
        frame.pack();
        frame.setVisible(true);
    }
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.AdjustmentEvent;
    import javax.swing.AbstractAction;
    import javax.swing.GroupLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    
    /**
     * @see https://stackoverflow.com/a/41926375/230513
     * @see https://stackoverflow.com/a/14858272/230513
     * @see https://stackoverflow.com/a/8504753/230513
     * @see https://stackoverflow.com/a/14011536/230513
     */
    public class DynamicGroupLayout {
    
        private static final int NUM = 6;
        private GroupLayout layout;
        private GroupLayout.ParallelGroup parallel;
        private GroupLayout.SequentialGroup sequential;
        private int i;
    
        private JPanel create() {
            JPanel panel = new JPanel();
            layout = new GroupLayout(panel);
            panel.setLayout(layout);
            layout.setAutoCreateGaps(true);
            layout.setAutoCreateContainerGaps(true);
            parallel = layout.createParallelGroup();
            layout.setHorizontalGroup(layout.createSequentialGroup().addGroup(parallel));
            sequential = layout.createSequentialGroup();
            layout.setVerticalGroup(sequential);
            for (int i = 0; i < NUM; i++) {
                add();
            }
            return panel;
        }
    
        private void add() {
            JLabel label = new JLabel(String.valueOf(i + 1), JLabel.RIGHT);
            JTextField field = new JTextField(String.valueOf("String " + (i + 1)));
            label.setLabelFor(field);
            parallel.addGroup(layout.createSequentialGroup().
                addComponent(label).addComponent(field));
            sequential.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE).
                addComponent(label).addComponent(field));
            i++;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame f = new JFrame("DynamicGroupLayout");
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    final DynamicGroupLayout dgl = new DynamicGroupLayout();
                    final JPanel panel = dgl.create();
                    JScrollPane jsp = new JScrollPane(panel) {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(320, 240);
                        }
                    };
                    jsp.getVerticalScrollBar().addAdjustmentListener((AdjustmentEvent e) -> {
                        e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                    });
                    f.add(jsp);
                    JPanel controls = new JPanel();
                    controls.add(new JButton(new AbstractAction("Add") {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            dgl.add();
                            panel.validate();
                        }
                    }));
                    f.add(controls, BorderLayout.SOUTH);
                    f.pack();
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
                }
            });
        }
    }