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