1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
| public class FieldCreator extends JPanel implements ActionListener,
ContainerListener {
private JTextField tf = new JTextField(20);
private JComponent receiver;
private Set names = new HashSet();
public FieldCreator(JComponent receiver) {
this.receiver = receiver;
receiver.addContainerListener(this);
setBorder(BorderFactory.createTitledBorder("Nouveau champ"));
JLabel label = new JLabel("Intitulé");
label.setLabelFor(tf);
JButton plus = new JButton("+");
plus.addActionListener(this);
add(label);
add(tf);
add(plus);
}
public void actionPerformed(ActionEvent e) {
String name = tf.getText();
if (name.length() == 0) {
JOptionPane.showMessageDialog(this, "Veuillez saisir un intitulé",
"Erreur", JOptionPane.ERROR_MESSAGE);
} else if (names.contains(getObfuscatedName(name))) {
JOptionPane
.showMessageDialog(this, "L'intitulé '" + name
+ "' est déjà utilisé", "Erreur",
JOptionPane.ERROR_MESSAGE);
} else {
RemovableField rf = new RemovableField(name);
rf.setName(getObfuscatedName(name));
receiver.add(rf);
receiver.revalidate();
}
}
public void componentAdded(ContainerEvent e) {
names.add(e.getChild().getName());
}
public void componentRemoved(ContainerEvent e) {
names.remove(e.getChild().getName());
}
private String getObfuscatedName(String name) {
return "###" + name + "###";
}
}
public class RemovableField extends JPanel implements ActionListener {
private String ident;
private JTextField tf = new JTextField(20);
public RemovableField(String ident) {
this.ident = ident;
JLabel label = new JLabel(ident);
label.setLabelFor(tf);
JButton minus = new JButton("-");
minus.addActionListener(this);
add(label);
add(tf);
add(minus);
}
public void actionPerformed(ActionEvent e) {
Container parent = getParent();
if (parent != null) {
parent.remove(this);
if (parent instanceof JComponent) {
((JComponent) parent).revalidate();
} else {
parent.validate();
}
parent.repaint();
}
}
public String getIdent() {
return ident;
}
public String getValue() {
return tf.getText();
}
}
public class RemovableFieldUtils {
private Container c;
public RemovableFieldUtils(Container c) {
this.c = c;
}
public Iterator getRemovableFieldIterator() {
return new RemovableFieldIterator();
}
public String getRemovableFieldValue(String ident) {
Iterator it = getRemovableFieldIterator();
while (it.hasNext()) {
RemovableField rf = (RemovableField) it.next();
if (rf.getIdent().equals(ident)) {
return rf.getValue();
}
}
return null;
}
public String getAllRemovableFieldValues() {
StringBuffer sb = new StringBuffer();
Iterator it = getRemovableFieldIterator();
while (it.hasNext()) {
RemovableField rf = (RemovableField) it.next();
sb.append(rf.getIdent()).append("=").append(rf.getValue()).append(
"\n");
}
return sb.toString();
}
private class RemovableFieldIterator implements Iterator {
Stack sp = new Stack();
Object next;
boolean hasNext;
RemovableFieldIterator() {
sp.push(Arrays.asList(c.getComponents()).iterator());
hasNext = skip();
}
private boolean skip() {
loop: while (!sp.isEmpty()) {
Iterator it = (Iterator) sp.peek();
while (it.hasNext()) {
next = it.next();
if (next instanceof RemovableField) {
return true;
} else if (next instanceof Container) {
sp.push(Arrays.asList(
((Container) next).getComponents()).iterator());
continue loop;
}
}
sp.pop();
}
return false;
}
public void remove() {
}
public boolean hasNext() {
return hasNext;
}
public Object next() {
if (!hasNext) {
throw new NoSuchElementException();
}
Object rv = next;
hasNext = skip();
return rv;
}
}
public static void main(String[] args) {
JFrame f = new JFrame ();
Container cp = f.getContentPane();
JPanel receiver = new JPanel();
final RemovableFieldUtils rfu = new RemovableFieldUtils(receiver);
receiver.setLayout(new BoxLayout(receiver, BoxLayout.Y_AXIS));
cp.add(new JScrollPane(receiver));
cp.add(new FieldCreator(receiver), BorderLayout.NORTH);
final JTextArea ta = new JTextArea(40, 20);
cp.add(ta, BorderLayout.EAST);
JButton button = new JButton("Valeurs");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ta.setText(rfu.getAllRemovableFieldValues());
}
});
cp.add(button, BorderLayout.SOUTH);
f.setSize(600, 400);
f.setVisible(true);
}
} |
Partager