2013-10-12 26 views
0

我一直在使用以下技術在過去禁用編輯JSpinner s。但是,它似乎並不適用於JTextFieldDateEditor。是否有這個editor.getTextField().setEditable(false)在這種情況下不起作用的原因?並有沒有辦法得到它的工作?無法禁用編輯DateEditor的JTextField?

驅動程序類

public class CLIClockDriver { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new ClockFrame(); 
      } 
     }); 
    } 
} 

搖擺類

public class ClockFrame extends JFrame implements ActionListener { 

    private static final long serialVersionUID = -7009835158496820266L; 
    public static final Dimension SIZE = new Dimension(400, 200); 

    private final Timer secondsTimer = new Timer(1000, this); 
    private final FluentGridBagConstraints gbc = new FluentGridBagConstraints(); 
    private JPanel mainPanel; 
    private JLabel clockLabel; 
    private JSpinner newAlarmHourSpinner, newAlarmMinuteSpinner, newAlarmAMPMSpinner; 

    public ClockFrame() { 
     super(); 
     setLayout(new GridBagLayout()); 
     initializeGUIComponents(); 
     setPreferredSize(SIZE); 
     setResizable(false); 
     setTitle(Constants.APPLICATION_NAME); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
     secondsTimer.start(); 
    } 



    private void initializeGUIComponents() { 
     mainPanel = new JPanel(new GridBagLayout()); 

     clockLabel = new JLabel(); 
     updateClock(); 
     mainPanel.add(clockLabel, gbc.setXY(0, 0)); 

     newAlarmHourSpinner = new JSpinner(); 
     newAlarmHourSpinner.setModel(new CyclingSpinnerNumberModel(9, 1, 12, 1)); 
     DefaultEditor editor = new JSpinner.DefaultEditor(newAlarmHourSpinner); 
     editor.getTextField().setColumns(2); 
     editor.getTextField().setEditable(false); 
     newAlarmHourSpinner.setEditor(editor); 
     mainPanel.add(newAlarmHourSpinner, gbc.reset().setXY(0, 1)); 

     newAlarmMinuteSpinner = new JSpinner(); 
     SpinnerDateModel model = new SpinnerDateModel(); 
     model.setCalendarField(Calendar.MINUTE); 
     newAlarmMinuteSpinner.setModel(model); 
     DateEditor dateEditor = new JSpinner.DateEditor(newAlarmMinuteSpinner, "mm"); 
     editor.getTextField().setColumns(2); 
     editor.getTextField().setEditable(false); 
     newAlarmMinuteSpinner.setEditor(dateEditor); 
     mainPanel.add(newAlarmMinuteSpinner, gbc.reset().setXY(1, 1)); 

     newAlarmAMPMSpinner = new JSpinner(); 
     newAlarmAMPMSpinner.setModel(new CyclingSpinnerListModel("AM", "PM")); 
     editor = new JSpinner.DefaultEditor(newAlarmAMPMSpinner); 
     editor.getTextField().setColumns(2); 
     editor.getTextField().setEditable(false); 
     newAlarmAMPMSpinner.setEditor(editor); 
     mainPanel.add(newAlarmAMPMSpinner, gbc.reset().setXY(2, 1)); 

     add(mainPanel, gbc.reset().setXY(0, 0)); 
    } 

    private void updateClock() { 
     clockLabel.setText(Alarm.TIME_FORMAT.format(new Date())); 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
     if(event.getSource() == secondsTimer) { 
      updateClock(); 
     } 
    } 


} 

回答

2

確保您的GUI是在美國東部時間創建的。

時,我有以下變化對How to Use Spinners運行從Swing教程中的SpinnerDemo代碼它工作正常,我:

ftf = getTextField(spinner); 
    ftf.setEditable(false); 

不過,我也有問題,我簡單的微調測試程序的時候我沒有在EDT上創建GUI。

+0

嗯...是的,我試着正是這樣做的。我如何確保在特定時區創建GUI? – asteri

+0

EDT;請參閱[事件調度線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

+0

@trashgod啊,我明白了。我將GUI初始化投入到'invokeLater'塊中,並沒有幫助。感謝您的澄清。 – asteri