[英]JTextField in a loop of slider listener
I'm beginner in java programing and I encounter a problem. 我是Java编程的初学者,遇到问题。 My aim is to relate slider, which give me number of figure's vertices, with simultaneously creating JFieldText fields of coordinates as it is on picture:
我的目标是关联滑条,该滑条可为我提供多个图形的顶点,并同时创建图片上坐标的JFieldText字段:
My attempts led me to the problem where I'm creating those fields but there are to many cols despite of taking 2 in GridLayout and when I'm decreasing the value of vertices, fields doesn't. 我的尝试导致了我在创建这些字段时遇到的问题,尽管在GridLayout中取2却有很多列,而当我减小顶点的值时,字段却没有。 Here is my sample of code:
这是我的代码示例:
int vertices = 3;
slider.addChangeListener(new SpinerListener());
class SpinerListener implements ChangeListener {
public void stateChanged(ChangeEvent arg0) {
vertices = slider.getValue();
right.setLayout(new GridLayout(vertices, 2));//right is my panel
for (int i = 0; i < vertices*2; i++) {
fields[i] = new JTextField("Field " + i);
right.add(fields[i]);
}
right.removeAll();
}
}
Use some kind of List
- which provides a concept of dynamically sizeable container of objects, instead of using an array. 使用某种
List
-提供一个可动态调整大小的对象容器的概念,而不是使用数组。 With this, you could then determine if you need to add or remove items from the List
depending on the new value of the JSlider
. 这样,您就可以根据
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();
}
}
}
So, it's pretty basic, it simply compares the number of field pairs to the desired amount and grows or shrinks the List
accordingly. 因此,这很基本,它只是将字段对的数量与所需数量进行比较,并相应地增大或缩小
List
。
As to the GridLayout
, you actually only need to set it once... 至于
GridLayout
,您实际上只需要设置一次...
right = new JPanel(new GridLayout(0, 2));
Parameters:
参数:
rows - the rows, with the value zero meaning any number of rows.rows-行,值为零表示任意数量的行。
cols - the columns, with the value zero meaning any number of columns.cols-列,值为零表示任意数量的列。
But, personally, I'd be tempted to use a GridBagLayout
, but that's me 但是,就我个人而言,我很想使用
GridBagLayout
,但这就是我
And because I had to test the logic... 而且因为我必须测试逻辑...
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();
}
}
}
}
}
Use a JTable
, which may be simpler and easier to manage - See How to use tables for more details 使用
JTable
,它可能更简单,更易于管理-有关更多详细信息,请参见如何使用表
If you must use JTextFields, then remove all the JTextFields first in the listener before re-adding the new JTextFields. 如果你必须使用JTextField的情况,然后才重新添加新JTextFields将首先删除所有JTextField的听者。 You can use
GridLayout(0, 2)
for all since this means 2 columns and variable rows. 可以将
GridLayout(0, 2)
用于所有对象,因为这意味着2列和可变行。
Possibly better: use a JTable and simply change the number of rows. 可能更好:使用JTable并只需更改行数即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.