你可以...
使用某种List - 它提供了动态大小的对象容器的概念,而不是使用数组。这样,您就可以根据JSlider 的新值确定是否需要在List 中添加或删除项目。
private List<JTextField[]> fields = new ArrayList<>(3);
//....
class SpinerListener implements ChangeListener {
public void stateChanged(ChangeEvent arg0) {
vertices = slider.getValue();
if (vertices < fields.size()) {
List<JTextField[]> oldFields = fields.subList(vertices + 1, fields.size());
for (JTextField[] pairs : oldFields) {
for (JTextField field : pairs) {
right.remove(field);
}
}
fields.removeAll(oldFields);
right.revalidate();
right.repaint();
} else if (vertices > fields.size()) {
int count = (vertices - fields.size());
System.out.println("Add " + count + " new fields");
for (int index = 0; index < count; index++) {
JTextField[] pairs = new JTextField[2];
pairs[0] = new JTextField(4);
pairs[1] = new JTextField(4);
for (JTextField field : pairs) {
right.add(field);
}
fields.add(pairs);
}
right.revalidate();
right.repaint();
}
}
}
所以,它非常基本,它只是将字段对的数量与所需数量进行比较,并相应地增加或缩小 List。
至于GridLayout,其实只需要设置一次...
right = new JPanel(new GridLayout(0, 2));
来自JavaDocs
参数:
rows - 行数,值为零的意思
任意数量的行。
cols - 列,值为零
表示任意数量的列。
但是,就我个人而言,我很想使用GridBagLayout,但这就是我
因为我必须测试逻辑......
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JSlider slider;
private int vertices = 3;
private List<JTextField[]> fields = new ArrayList<>(3);
private JPanel right;
public TestPane() {
setLayout(new BorderLayout());
right = new JPanel(new GridLayout(0, 2));
add(new JScrollPane(right));
slider = new JSlider();
slider.addChangeListener(new SpinerListener());
slider.setValue(vertices);
add(slider, BorderLayout.NORTH);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
class SpinerListener implements ChangeListener {
public void stateChanged(ChangeEvent arg0) {
vertices = slider.getValue();
if (vertices < fields.size()) {
List<JTextField[]> oldFields = fields.subList(vertices + 1, fields.size());
for (JTextField[] pairs : oldFields) {
for (JTextField field : pairs) {
right.remove(field);
}
}
fields.removeAll(oldFields);
right.revalidate();
right.repaint();
} else if (vertices > fields.size()) {
int count = (vertices - fields.size());
System.out.println("Add " + count + " new fields");
for (int index = 0; index < count; index++) {
JTextField[] pairs = new JTextField[2];
pairs[0] = new JTextField(4);
pairs[1] = new JTextField(4);
for (JTextField field : pairs) {
right.add(field);
}
fields.add(pairs);
}
right.revalidate();
right.repaint();
}
}
}
}
}
或者你可以...
使用JTable,这可能更简单、更易于管理 - 有关详细信息,请参阅How to use tables