Search code examples
javaswingjtextfieldactioneventgetvalue

Using values from one textField into another textField


I am trying to calculate sub-total in a separate textField from an event which involves user selecting number of rooms and number of days (based on check in and check out dates).

This textField (sub-total) will effectively multiply (no of days * no of rooms * room price) and will be updated when the user changes duration or number of rooms.

Please note my GUI is based on drag and drop.

private void checkDoubleActionPerformed(java.awt.event.ActionEvent evt) {                                            
 // User clicks "Check Availability" button after selecting number of Double Rooms required and duration of stay

   String value2 = spinner2.getValue().toString(); //Getting number of room using spinner2

    //.set a default current date to Check in. Can be changed by customer
    cid_chooser2.getJCalendar().setMinSelectableDate(new Date());
    cid_chooser2.setMinSelectableDate(new Date());

    Date d1 = null; //initial value of check in date
    Date d2 = null; // initial value of check out date

    try {
        d1 = cid_chooser2.getDate();
        d2 = cod_chooser2.getDate();

        long duration = d2.getTime() - d1.getTime(); //calculationg duration in days
        long days = TimeUnit.MILLISECONDS.toDays(duration);

        if (days > 0) {

            JOptionPane pane = new JOptionPane("You selected " + value2 + " Double Rooms for: " + days,JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION);
            JDialog dialog = pane.createDialog(null, "Customer Notification");
            dialog.setSize(new Dimension(400, 200));
            dialog.show();
        }
        else {JOptionPane.showMessageDialog(null, "Check out Date needs to be after Check in Date ");
        }
    }
    catch (NullPointerException ex1) {

        if (d1 == null && d2 == null) {

            JOptionPane.showMessageDialog(null, "Please enter missing check in AND check out dates.");
        }

        else if (d2 == null) {
            JOptionPane.showMessageDialog(null, "Please enter missing check out date."
                + "\nyour check out date should be at least a day after your check in date");
        }
        else if (d1 == null) {

            JOptionPane.showMessageDialog(null, "Please enter missing check in date."
                + "\nyour check in date should be at least today");
        }
    }                                          

}                         

   ////////////// separate JTextField to calculate sub-total////////////

  private void subTotal2ActionPerformed(java.awt.event.ActionEvent evt) {                                          
// sub-Total based on number of Double Rooms selected * duration (days) * unit price

}  

Solution

  • I hope this sample program will show you how to do this. Here I'm using JDateChooser class which can be downloaded from: https://toedter.com/jcalendar/

    If you are using some other date component, I'm sure that class would also have a similar API like addPropertyChangeListener() which you can use.

    import com.toedter.calendar.JDateChooser;
    
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.GridLayout;
    import java.awt.event.*;
    import java.beans.*;
    import java.util.Date;
    
    public class CalculateSubTotal {
    
      private static JDateChooser checkin = new JDateChooser();
      private static JDateChooser checkout = new JDateChooser();
      private static JSpinner rooms = new JSpinner(new SpinnerNumberModel(1, 0, 10, 1));
      private static JTextField subTotal = new JTextField(20);
      private static JButton button = new JButton("Check availability");
    
      public static void main(String[] args) {
    
        checkin.getDateEditor().addPropertyChangeListener("date", new PropertyChangeListener() {
          @Override
          public void propertyChange(PropertyChangeEvent evt) {
            calculateSubTotal(checkin.getDate(), checkout.getDate(), (Integer) rooms.getValue(), 50);
          }
        });
    
        checkout.getDateEditor().addPropertyChangeListener("date", new PropertyChangeListener() {
          @Override
          public void propertyChange(PropertyChangeEvent evt) {
            calculateSubTotal(checkin.getDate(), checkout.getDate(), (Integer) rooms.getValue(), 50);
          }
        });
    
        rooms.addChangeListener(new ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent e) {
            calculateSubTotal(checkin.getDate(), checkout.getDate(), (Integer) rooms.getValue(), 50);
          }
        });
    
        button.addActionListener(new ActionListener()
        {
          @Override
          public void actionPerformed(ActionEvent e) {
            calculateSubTotal(checkin.getDate(), checkout.getDate(), (Integer) rooms.getValue(), 50);
          }
        });
    
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new GridLayout(6, 2));
        f.getContentPane().add(new JLabel("Price"));
        f.getContentPane().add(new JLabel("50"));
        f.getContentPane().add(new JLabel("Check in"));
        f.getContentPane().add(checkin);
        f.getContentPane().add(new JLabel("Check out"));
        f.getContentPane().add(checkout);
        f.getContentPane().add(new JLabel("Number of rooms"));
        f.getContentPane().add(rooms);
        f.getContentPane().add(new JLabel("Sub total"));
        f.getContentPane().add(subTotal);
        f.getContentPane().add(button);
        f.setBounds(300, 200, 400, 300);
        f.setVisible(true);
      }
    
      private static void calculateSubTotal(Date checkin, Date checkout, int rooms, int price) {
        if (checkin == null || checkout == null) {
          return;
        }
        int sub = getDays(checkin, checkout) * rooms * price;
        subTotal.setText(String.valueOf(sub));
      }
    
      private static int getDays(Date checkin, Date checkout) {
        return (int) ((checkout.getTime() - checkin.getTime()) / (1000 * 60 * 60 * 24));
      }
    }