2017-06-28 24 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);