Как автоматически рассчитать входные числовые значения текстового поля в JAVA
У меня проблема с автоматическим вычислением текстового поля в JAVA с использованием Netbeans 7.2
У меня вопрос, буду ли я вводить числовые значения в текстовое поле, т. Е. (Плата за вход, ежемесячная плата, плата за транспорт и т. Д.) Для автоматического добавления, а затем вводить числовые значения в текстовое поле, т. Е. (Пошлины), чтобы автоматически вычитать указанное выше автоматическое добавление перед нажатием кнопки Отправить. Кнопка, чтобы вставить итоговые значения в базу данных, чтобы я мог получить результат этих числовых значений в текстовом поле (всего), прежде чем нажать кнопку Отправить.
Пожалуйста, проверьте снимок:
http://s14.postimage.org/95zxgp575/image.jpg
Мой исходный код:
try
{
String insrt = "Insert into fee (admission, monthly, transport, dues, total) values (?, ?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(insrt);
pstmt.setString(1, adm_fee.getText());
pstmt.setString(2, mnth_fee.getText());
pstmt.setString(3, trnsprt_fee.getText());
pstmt.setString(4, dues_fee.getText());
pstmt.setString(5, total_fee.getText());
pstmt.executeUpdate();
JOptionPane.showMessageDialog(null,"Record successfully inserted");
}
catch (Exception exp)
{
JOptionPane.showMessageDialog(null, exp);
}
2 ответа
Я предлагаю использовать DocumentFilter
это позволит нам убить 2 зайцев одним выстрелом.
1) нам нужно отфильтровать то, что вводится в JTextField
чтобы убедиться, что наш расчет не ошибется
2) Нам нужно обновлять сумму на лету, т. Е. По мере добавления / удаления дополнительных цифр.
Вот пример, который я сделал, который использует DocumentFilter
и, как вы увидите, поле Всего будет обновляться каждый раз, когда новая цифра вводится / добавляется к JTextField
(s) (также не допускается использование букв и т. д. только цифр):
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class DocumentFilterOnTheFlyCalculation {
public DocumentFilterOnTheFlyCalculation() {
createAndShowGui();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new DocumentFilterOnTheFlyCalculation();
}
});
}
private void createAndShowGui() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(4, 2));
JLabel label1 = new JLabel("Add:");
final JTextField jtf1 = new JTextField();
JLabel label2 = new JLabel("Add:");
final JTextField jtf2 = new JTextField();
JLabel label3 = new JLabel("Subtract:");
final JTextField jtf3 = new JTextField();
JLabel totalLabel = new JLabel("Total:");
final JTextField totalField = new JTextField("0");
totalField.setEditable(false);
DocumentFilter df = new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
if (isDigit(string)) {
super.insertString(fb, i, string, as);
calcAndSetTotal();
}
}
@Override
public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
super.remove(fb, i, i1);
calcAndSetTotal();
}
@Override
public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
if (isDigit(string)) {
super.replace(fb, i, i1, string, as);
calcAndSetTotal();
}
}
private boolean isDigit(String string) {
for (int n = 0; n < string.length(); n++) {
char c = string.charAt(n);//get a single character of the string
//System.out.println(c);
if (!Character.isDigit(c)) {//if its an alphabetic character or white space
return false;
}
}
return true;
}
void calcAndSetTotal() {
int sum = 0;
if (!jtf1.getText().isEmpty()) {
sum += Integer.parseInt(jtf1.getText());//we must add this
}
if (!jtf2.getText().isEmpty()) {
sum += Integer.parseInt(jtf2.getText());//we must add this
}
if (!jtf3.getText().isEmpty()) {
sum -= Integer.parseInt(jtf3.getText());//we must subtract this
}
totalField.setText(String.valueOf(sum));
}
};
((AbstractDocument) (jtf1.getDocument())).setDocumentFilter(df);
((AbstractDocument) (jtf2.getDocument())).setDocumentFilter(df);
((AbstractDocument) (jtf3.getDocument())).setDocumentFilter(df);
frame.add(label1);
frame.add(jtf1);
frame.add(label2);
frame.add(jtf2);
frame.add(label3);
frame.add(jtf3);
frame.add(totalLabel);
frame.add(totalField);
frame.pack();
frame.setVisible(true);
}
}
Если вам не нужно обновление для каждого нажатия клавиши, этот альтернативный подход использует оба FocusListener
и PropertyChangeListener
в update()
сумма по мере накопления изменений.
введите описание изображения здесь. Вы можете использовать событие MouseEntered для автоматического отображения вычисленного значения в поле jtext, как показано в коде
private void TxtnetpayMouseEntered(java.awt.event.MouseEvent evt) {
DecimalFormat numberFormat = new DecimalFormat("#.00");
double totalgrosssalary = Double.parseDouble(Txttotalgrosspay.getText());
double totaldeduct = Double.parseDouble(Txttotaldeduction.getText());
netpay = totalgrosssalary - totaldeduct;
String netpayy = String.valueOf(numberFormat.format(netpay));
Txtnetpay.setText(netpayy);
}