Java 无法禁用日期编辑器的编辑';是JTextField吗?
过去我一直在使用下面的技术来禁用对Java 无法禁用日期编辑器的编辑';是JTextField吗?,java,swing,jtextfield,jspinner,Java,Swing,Jtextfield,Jspinner,过去我一直在使用下面的技术来禁用对JSpinners的编辑。然而,它似乎不能与日期编辑器中的JTextField一起工作。是否有原因导致此editor.getTextField().setEditable(false)在这种情况下不起作用?有没有办法让它发挥作用 驾驶员等级 public class CLIClockDriver { public static void main(String[] args) { SwingUtilities.invokeLater(ne
JSpinner
s的编辑。然而,它似乎不能与日期编辑器中的JTextField
一起工作。是否有原因导致此editor.getTextField().setEditable(false)
在这种情况下不起作用?有没有办法让它发挥作用
驾驶员等级
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();
}
}
}
摇摆类
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是在EDT上创建的
当我在上运行Swing教程中的SpinnerDemo代码并进行以下更改时,它可以正常工作:
ftf = getTextField(spinner);
ftf.setEditable(false);
然而,当我没有在EDT上创建GUI时,我的简单微调器测试程序也有问题。Hm。。。是的,我也试过这样做。如何确保在特定时区创建GUI?EDT;看。@垃圾上帝啊,我明白了。我将GUI初始化扔到了一个invokeLater
块中,它没有任何帮助。感谢您的澄清。@JeffGohlke,我将GUI初始化抛到了invokeLater块中,但没有任何帮助。
-您下载了教程示例并试用了吗?张贴您的SSCCE
,即使在EDT上正确创建帧和微调器,也可以演示问题。