Использование значений из одного текстового поля в другое текстовое поле

Я пытаюсь рассчитать промежуточный итог в отдельном текстовом поле из события, в котором пользователь выбирает количество комнат и количество дней (на основе дат заезда и выезда).

Это текстовое поле (промежуточный итог) будет эффективно умножаться (количество дней * количество комнат * стоимость номера) и будет обновляться, когда пользователь меняет продолжительность или количество комнат.

Обратите внимание, что мой графический интерфейс основан на перетаскивании.

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

}  

person Emanuel    schedule 16.01.2019    source источник
comment
Затем я рассчитал бы общую сумму (Отдельное текстовое поле) цен на одноместное, двухместное бронирование и бронирование конференц-залов.   -  person Emanuel    schedule 16.01.2019
comment
Какие бывают типы cid_chooser2, cod_chooser2 и spinner2? com.toedter.calendar.JDateChooser и javax.swing.JSpinner? Итак, я полагаю, вы хотите, чтобы промежуточный итог вычислялся и устанавливался в текстовом поле всякий раз, когда изменяются значения cid_chooser2, cod_chooser2 или spinner2?   -  person Prasad Karunagoda    schedule 16.01.2019
comment
Привет, Прасад. cid_chooser2 — это средство выбора даты (дата заезда), cod_chooser2 — средство выбора даты (дата выезда), Spinner2 (для выбора количества двухместных номеров). Когда пользователь нажимает «Проверить доступность» (checkDoubleActionPerformed), я хочу, чтобы текстовое поле (subTotal2ActionPerformed) вычисляло промежуточный итог. Вы правы в том, что я хотел бы, чтобы это текстовое поле отображало пересмотренный промежуточный итог, если пользователь изменил продолжительность или количество комнат. Спасибо   -  person Emanuel    schedule 16.01.2019
comment
Вопрос для меня не совсем ясен. Вы хотите, чтобы поле промежуточной суммы обновлялось, когда пользователь нажимает кнопку «Проверить доступность», ИЛИ вы хотите, чтобы поле промежуточной суммы обновлялось, как только пользователь меняет дату заезда, дату выезда или количество комнат?   -  person Prasad Karunagoda    schedule 16.01.2019
comment
Другое дело, вы используете класс javafx.scene.control.DatePicker в качестве компонентов даты? Если да, то создаете ли вы пользовательский интерфейс с помощью JavaFX? Не свинг?   -  person Prasad Karunagoda    schedule 16.01.2019
comment
Привет, Прасад, по умолчанию промежуточный итог может быть равен 0. Однако, когда пользователь (1) выбирает дату заезда (2) дату выезда (3) количество двухместных номеров для бронирования (4) нажимает кнопку «Событие» ( Проверьте доступность)... промежуточная сумма должна измениться на цену * количество двухместных номеров * количество дней.... Я хотел бы отправить вам графический интерфейс для точной иллюстрации (если вы хотите, чтобы скриншот был отправлен по электронной почте)... Я уверен, что это Swing GUI.   -  person Emanuel    schedule 16.01.2019
comment
@ Эмануэль, скажите мне имена классов (полные имена, включая пакеты), которые вы используете для компонентов даты и компонента счетчика. Не зная точных классов, мы не можем рассказать вам о доступных API для привязки прослушивателей событий. (Или добавьте весь код к вопросу.)   -  person Prasad Karunagoda    schedule 16.01.2019
comment
Привет, Прасад. С самого начала я упомянул, что все это находится в графическом интерфейсе Swing, и я кодирую события действия графического интерфейса. Я не использую доменные классы, так как собираюсь работать с Arraylist, а не с БД. У вас есть вся информация в коде, который я скопировал ранее. Надеюсь, что это полезно.   -  person Emanuel    schedule 16.01.2019


Ответы (1)


Я надеюсь, что эта примерная программа покажет вам, как это сделать. Здесь я использую класс JDateChooser, который можно загрузить с: https://toedter.com/jcalendar/.

Если вы используете какой-либо другой компонент даты, я уверен, что этот класс также будет иметь аналогичный API, такой как addPropertyChangeListener(), который вы можете использовать.

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));
  }
}
person Prasad Karunagoda    schedule 17.01.2019
comment
Большое спасибо, Прасад! Все это имеет смысл сейчас. Большое спасибо :) - person Emanuel; 19.01.2019
comment
@Эмануэль, пожалуйста. Пожалуйста, примите / проголосуйте за ответ, если он был полезен :) - person Prasad Karunagoda; 19.01.2019
comment
Только что сделал это. Извините, я немного привыкаю к ​​способам StackOverFlow. Бог благословил. - person Emanuel; 19.01.2019
comment
@ Эмануэль, но я не вижу, чтобы мой ответ был принят или проголосован :) (Это может вам помочь: stackoverflow.com/help/someone- ответы) - person Prasad Karunagoda; 19.01.2019
comment
Я проголосовал снова, и появилось то же сообщение, что и в прошлый раз. Спасибо за ответ! Голоса, отданные теми, у кого репутация менее 15, записываются, но не изменяют публично отображаемый результат публикации. Я предполагаю, что мне нужно заработать некоторую репутацию, чтобы мой голос был публично показан. Я надеюсь, что вы не разочарованы этим прасадом. - person Emanuel; 19.01.2019
comment
@ Эмануэль, но вы должны принять ответ (нажав √ под кнопками голосования). Для этого вам не нужны очки репутации. В любом случае все в порядке, я не разочарован. Я рад, что смог помочь :) - person Prasad Karunagoda; 19.01.2019
comment
Просто увидел это (√ под кнопками голосования) и нажал . Теперь он показывает зеленый. Я надеюсь, что теперь он отражает правильно для вас. Большое спасибо и дайте мне знать, если иначе. - person Emanuel; 19.01.2019
comment
@ Эмануэль, да, теперь я вижу, что мой ответ принят. Большое тебе спасибо :) - person Prasad Karunagoda; 19.01.2019
comment
Спасибо тебе, Прасад! Я застрял на этом в течение нескольких дней, пока вы не помогли. Я не знаю, почему мой вопрос был отклонен кем-то. Это очень правильный вопрос! - person Emanuel; 19.01.2019