Не могу изменить значения даты на Spinner - PullRequest
0 голосов
/ 01 мая 2019

Я хочу написать некоторый код, который получает входные данные от двух JSpinners. Я хочу, чтобы я мог изменить значения JSpinners и получить строковое значение из того, что показано в Spinners. Я сделал это, добавив ChangeListener. Однако в реальном приложении я не могу изменить значения на счетчике, или, другими словами, я не могу перемещать счетчик вверх или вниз

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


  public class SalesApplication extends JFrame {

    SpinnerModel model1;
   JSpinner spinner1;
   SpinnerModel model2;
   JSpinner spinner2;

   public SalesApplication(){

        model1 = new SpinnerDateModel();
           spinner1 = new JSpinner(model1);


 //Sub any date you want
           Date firstDate1 = null;
           model1 = new SpinnerDateModel(firstDate1, null, null, Calendar.DAY_OF_MONTH);


            class SpinnerListener1 implements ChangeListener {
             public void stateChanged(ChangeEvent e) {
             JSpinner spinner = (JSpinner) e.getSource();
             initialDate = (String) spinner.getValue();
      }
         }; 
          spinner1.addChangeListener(new SpinnerListener1());


           model2 = new SpinnerDateModel();
           spinner2 = new JSpinner(model2);
           Date firstDate2 = null ;
           model2 = new SpinnerDateModel(firstDate2, null, null, Calendar.DAY_OF_MONTH);

            class SpinnerListener2 implements ChangeListener {
           public void stateChanged(ChangeEvent e) {
             JSpinner spinner = (JSpinner) e.getSource();
             endDate = (String) spinner.getValue();
      }
         };
    spinner2.addChangeListener(new SpinnerListener2());
       JPanel rightPanel = new JPanel();
       rightPanel.add(spinner1);
       rightPanel.add(spinner2);
       add(rightPanel, java.awt.BorderLayout.EAST);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setSize(600, 300);                       
       setVisible(true);

Ответы [ 2 ]

2 голосов

Вы создаете две SpinnerDateModel с этим кодом:

model1 = new SpinnerDateModel(); // SpinnerDateModel (1)
spinner1 = new JSpinner(model1);  // holds the first model
Date firstDate1 = dateObj[4];
model1 = new SpinnerDateModel(firstDate1, null, null, Calendar.DAY_OF_MONTH); // SpinnerDateModel (2)

В Spinner1 JSpinner содержится только первый объект SpinnerDateModel, а no JSpinner содержит второй объект, и поэтому этот объектпросто игнорируется и тратится впустую.Если вам нужно использовать вторую модель, даже не создавайте первую:

// model1 = new SpinnerDateModel(); // SpinnerDateModel (1)
// spinner1 = new JSpinner(model1);
Date firstDate1 = dateObj[4];
model1 = new SpinnerDateModel(firstDate1, null, null, Calendar.DAY_OF_MONTH); // SpinnerDateModel (2)
spinner1 = new JSpinner(model1); // now holds the second model

У вас точно такая же проблема для переменной model2.

Проблема, описанная вышев том, что вы, кажется, приравниваете переменную к объекту, который он содержит.Как только вы передадите SpinnerDateModel в JSpinner, изменение переменной, которую содержит ваша модель1 SpinnerDateModel, не будет иметь никакого влияния на объект модели, поддерживаемый самим JSpinner.

1 голос

Кажется, вы гадаете, как создавать объекты SpinnerDateModel и использовать их в JSpinner. Просто модели требуется дата начала, дата окончания и значение или дата для отображения. Например, что-то вроде этого:

// current value will be *today*
private Date value = new Date();  // today

// start will be the first of the year
private Date start = new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime();

// end will be the last of the year
private Date end = new GregorianCalendar(2019, Calendar.DECEMBER, 31).getTime();

// create date model using the above values
private SpinnerDateModel dateModel1 = new SpinnerDateModel(value, start, end, Calendar.DAY_OF_MONTH);

// put into JSpinner
private JSpinner spinner1 = new JSpinner(dateModel1);    

Затем в ChangeListener вы извлекаете объект Date из Spinner, поскольку это то, что он содержит. Вы, кажется, пытаетесь извлечь строку, которая не будет работать. Например:

spinner1.addChangeListener(evt -> {
    Date currentDate = (Date) spinner1.getValue(); // holds date values
    String dateText = format.format(currentDate); // if we want to extract a String from it
    System.out.println("Current Date: " + dateText);  // display it
});

Рабочий пример может выглядеть так:

import java.awt.Dimension;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.*;

@SuppressWarnings("serial")
public class SpinnerTester extends JPanel {
    // current value will be *today*
    private Date value = new Date();  // today

    // start will be the first of the year
    private Date start = new GregorianCalendar(2019, Calendar.JANUARY, 1).getTime();

    // end will be the last of the year
    private Date end = new GregorianCalendar(2019, Calendar.DECEMBER, 31).getTime();

    // create date model using the above values
    private SpinnerDateModel dateModel1 = new SpinnerDateModel(value, start, end, Calendar.DAY_OF_MONTH);

    // put into JSpinner
    private JSpinner spinner1 = new JSpinner(dateModel1);

    public SpinnerTester() {
        // get the format from the spinner's editor
        SimpleDateFormat format = ((JSpinner.DateEditor) spinner1.getEditor()).getFormat();

        // have our spinner show the date only, and not the time
        format.applyPattern("MM/dd/yyyy");

        // add to GUI
        add(spinner1);
        setPreferredSize(new Dimension(400, 200));

        spinner1.addChangeListener(evt -> {
            Date currentDate = (Date) spinner1.getValue(); // holds date values
            String dateText = format.format(currentDate); // if we want to extract a String from it
            System.out.println("Current Date: " + dateText);  // display it
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            SpinnerTester mainPanel = new SpinnerTester();
            JFrame frame = new JFrame("Spinner Tester");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        });
    }
}

Спасибо mKorbel за ответ за показ того, как отформатировать дату, отображаемую в JSpinner.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...