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
|
public class LinkedFieldPanel extends JPanel {
private JTextField field1;
private JTextField field2;
private boolean edited;
public LinkedFieldPanel(int value) {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
field1 = new JTextField();
add(field1);
field2 = new JTextField();
add(field2);
// le jtextfield ne sont pas adaptés nativement à la saisie de nombre
DocumentFilter filter = new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset,
String text, AttributeSet attr)
throws BadLocationException {
StringBuilder replace = new StringBuilder();
for(int i=0;i< text.length(); i++) {
char ch = text.charAt(i);
if ( Character.isDigit(ch) ) {
replace.append(ch);
}
}
text = replace.toString();
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
try {
Integer.parseInt(sb.toString());
super.insertString(fb, offset, text, attr);
}
catch(NumberFormatException e) {
Toolkit.getDefaultToolkit().beep();
}
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs)
throws BadLocationException {
StringBuilder replace = new StringBuilder();
for(int i=0;i< text.length(); i++) {
char ch = text.charAt(i);
if ( Character.isDigit(ch) ) {
replace.append(ch);
}
}
text = replace.toString();
StringBuilder sb = new StringBuilder(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.replace(offset, offset + length, text);
try {
Integer.parseInt(sb.toString());
super.replace(fb, offset, length, text, attrs);
}
catch(NumberFormatException e) {
Toolkit.getDefaultToolkit().beep();
}
}
};
((AbstractDocument)field1.getDocument()).setDocumentFilter(filter);
((AbstractDocument)field2.getDocument()).setDocumentFilter(filter);
field1.setText(String.valueOf(value));
field2.setText(String.valueOf(value - 95));
field1.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
change(field1);
}
@Override
public void insertUpdate(DocumentEvent e) {
change(field1);
}
@Override
public void changedUpdate(DocumentEvent e) {
change(field1);
}
});
field2.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
change(field2);
}
@Override
public void insertUpdate(DocumentEvent e) {
change(field2);
}
@Override
public void changedUpdate(DocumentEvent e) {
change(field2);
}
});
}
protected void change(JTextField field) {
if (edited)
return;
JTextField otherField;
String text = field.getText();
if (!text.isEmpty()) {
int value = Integer.parseInt(field.getText());
if (field == field1) {
value -= 95;
otherField = field2;
} else {
value += 95;
otherField = field1;
}
edited = true;
try {
otherField.setText(String.valueOf(value));
} finally {
edited = false;
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Titre");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final LinkedFieldPanel panel = new LinkedFieldPanel(150);
frame.getContentPane().add(panel);
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public int getField1() {
return Integer.parseInt(field1.getText());
}
public int getField2() {
return Integer.parseInt(field2.getText());
}
} |
Partager