0
我一直在使用以下技術在過去禁用編輯JSpinner
s。但是,它似乎並不適用於JTextField
的DateEditor
。是否有這個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();
}
}
}
嗯...是的,我試着正是這樣做的。我如何確保在特定時區創建GUI? – asteri
EDT;請參閱[事件調度線程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod
@trashgod啊,我明白了。我將GUI初始化投入到'invokeLater'塊中,並沒有幫助。感謝您的澄清。 – asteri