2017-06-28 73 views
-1

我創建了一個JSpinner對象,每天向上和向下移動,並在點擊時跳過週末。然後我添加了一項功能,如果您在週六或週日期間打開該程序,它應該回滾到星期五。問題不在於星期五JSpinner會跳回一週。JSpinner跳躍周而不是天

我試圖在新程序中隔離該問題,但都沒有成功。代碼應該是完全相同的,所以我不確定是什麼導致了這個問題。

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DecimalFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import javax.annotation.PostConstruct; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerDateModel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
@SuppressWarnings("serial") 
public class MainFrame extends JFrame { 

DecimalFormat df = new DecimalFormat("#.00"); 
SpinnerDateModel spinnerModel; 
JSpinner spinner; 
Integer loopStep; 
Integer firstloopStep = 0; 

MainFrame() { 
    super("Spinner Control"); 

    setLayout(new BorderLayout()); 

    JPanel panel1 = new JPanel(); 
    JPanel panelNorth = new JPanel(); 

    // spinner for date information 
    spinnerModel = new SpinnerDateModel(); 
    spinnerModel.setCalendarField(Calendar.WEEK_OF_MONTH); 
    spinner = new JSpinner(spinnerModel); 
    JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "EEEEE, dd MMMMM, yyyy"); 
    spinner.setEditor(editor); 

    // add panels/buttons/etc to page 
    add(panel1, BorderLayout.PAGE_START); 
    panel1.setPreferredSize(new Dimension(1280, 100)); 
    panelNorth.setPreferredSize(new Dimension(1280, 40)); 

    panel1.add(panelNorth, BorderLayout.NORTH); 
    panelNorth.add(spinner, BorderLayout.PAGE_START); 

    //method executes on start up 
    skipWeekends(); 

    loopStep = 0; 
    //rotate the date, skip weekends, works fine here 
    spinner.addChangeListener(new ChangeListener() { 
     @Override 
     public void stateChanged(ChangeEvent arg0) { 
      Date date = (Date) spinner.getValue(); 
      System.out.println("todays date " + date); 
      SimpleDateFormat sdf = new SimpleDateFormat("EEEEE, dd MMMMM, yyyy"); 
      String stringDate = sdf.format(date); 
      System.out.println(stringDate); 
      char c = stringDate.charAt(0); 
      char c2 = stringDate.charAt(1); 

      //skip the weekends 
      if ((c == 'S') && (c2 == 'a') && (loopStep == 0)) { 
       loopStep = 1; 
       spinner.setValue(spinner.getNextValue()); 
       spinner.setValue(spinner.getNextValue()); 
       System.out.println("Saturday Spinner going back 2"); 
      } 

      if ((c == 'S') && (c2 == 'u') && (loopStep == 0)) { 
       loopStep = 1; 
       spinner.setValue(spinner.getPreviousValue()); 
       spinner.setValue(spinner.getPreviousValue()); 
       System.out.println("Sunday Spinner going back 2"); 
      } 
      if (loopStep == 1) { 
       loopStep = 2; 
      } 
      if (loopStep == 2) { 
       loopStep = 0; 
      } 


     } 
    }); 


    setExtendedState(MAXIMIZED_BOTH); 
    setMinimumSize(new Dimension(1280, 485)); 
    setSize(640, 485); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 

} 

@PostConstruct 
private void skipWeekends(){ 
    //skips weekends when program opens, skips weeks for some reason 
    Date date = (Date) spinner.getValue(); 
    System.out.println("todays date " + date); 
    SimpleDateFormat sdf = new SimpleDateFormat("EEEEE, dd MMMMM, yyyy"); 
    String stringDate = sdf.format(date); 
    System.out.println(stringDate); 
    char c = stringDate.charAt(0); 
    char c2 = stringDate.charAt(1); 

    if ((c == 'S') && (c2 == 'a')) { 

     spinner.setValue(spinner.getPreviousValue()); 
     System.out.println("Saturday Spinner going back 2"); 
    } 

    if ((c == 'S') && (c2 == 'u')) { 

     spinner.setValue(spinner.getPreviousValue()); 
     spinner.setValue(spinner.getPreviousValue()); 
     System.out.println("Sunday Spinner going back 2"); 
    } 


} 

} 
+1

據我所知,微調器被設置爲通過'Calendar.WEEK_OF_MONTH'增加/減少,所以當你調用'getNextValue'時,它會從當前值滾動一週 - 也許你應該創建一個'Calendar '並將其向前/向後滾動到您想要的那一天並使用它來設置微調器的值 – MadProgrammer

+0

爲什麼它在changeListener中的stateChanged方法中有任何不同,它工作得很好?這讓我感到困惑。我曾經想過要這樣做,但我想我很接近解決這個問題,而不必更改一堆代碼。如果沒有其他事情出現,我會嘗試這種方法。 –

+0

你的微調旋轉了一週 - 爲什麼它會讓你感到驚訝? – MadProgrammer

回答

2

您正在將SpinnerDateModel的日曆字段設置爲Calendar.WEEK_OF_MONTH而不是Calendar.DAY_OF_WEEK。

當使用Spinner按鈕時,由於Spinner會在提交更改之前設置日曆字段(在SpinnerDateModel文檔中提及),因此可以無提示地進行更正。不過,在您有機會發生之前,您的@PostConstruct方法會運行。

如果我可以添加另一個建議:確定一週中當前日期的方式非常複雜且非常脆弱(例如,它會在德國打破,因爲「星期天」在這裏是「Sonntag」)。這是另一種選擇。從構造函數中初始化== true並從stateChanged()初始化== false。

private Calendar cal = new GregorianCalendar(); 

private void skipWeekends(boolean initial) { 
    cal.setTime(spinnerModel.getDate()); 

    switch (cal.get(Calendar.DAY_OF_WEEK)) { 
    case Calendar.SATURDAY: 
     cal.add(Calendar.DAY_OF_WEEK, initial ? -1 : 2); 
     break; 
    case Calendar.SUNDAY: 
     cal.add(Calendar.DAY_OF_WEEK, -2); 
     break; 
    } 
    spinnerModel.setValue(cal.getTime()); 
} 
+0

我用這個DAY_OF_YEAR,它也工作得很好。我嘗試瞭解決方案後立即看到了這條評論。無論如何,獎勵信息對於學習來說非常有用。謝謝。 –

+0

不客氣!我已經用一段代碼修正了人們的其他一些問題,從而更新了回覆。 –

1

我認爲你需要選擇,然後將JSpinner的的getNextValue()getPreviousValue()方法來影響當前日曆字段。

爲了讓你可以使用選擇:

spinner.setCalendarField(Calendar.DAY_OF_YEAR);