Почему одни и те же операции работают в ActionListener, а не в методе @schedule?

В следующем фрагменте кода метод actionPerformed() и метод aggiornaAutomaticamente() выполняют одни и те же операции. Почему в графическом интерфейсе я вижу изменения с помощью actionPerformed(), вызываемого JButton, но с методом aggiornaAutomaticamente() @scheduled, изменения не отображаются, даже если выполняются операции?

Я не вставляю весь код, а только его часть, так как операции выполняются правильно.

@Configuration
@EnableScheduling
public class Appoggio {

    private JFrame frmClientPrestazioniChat;
    private DateTimePicker dateTimePickerDa;
    private DateTimePicker dateTimePickerA;
    private JCheckBox chckbxAggiornaAutomaticamente;
    private JPanel pnlFiltri;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {

        // Comandi per usare spring
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(Appoggio.class);
        ctx.refresh();

    }


    /**
     * Create the application.
     */
    public Appoggio() {
        initialize();
    }


    /**
     * Initialize the contents of the frame.
     */
    @SuppressWarnings("serial")
    private void initialize() {
        frmClientPrestazioniChat = new JFrame();
        frmClientPrestazioniChat.setTitle("Client Prestazioni Chat");
        frmClientPrestazioniChat.setBounds(100, 100, 1209, 563);
        frmClientPrestazioniChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmClientPrestazioniChat.setExtendedState(frmClientPrestazioniChat.getExtendedState() | JFrame.MAXIMIZED_BOTH);

        JSplitPane splitPaneMain = new JSplitPane();
        splitPaneMain.setResizeWeight(0.2);
        frmClientPrestazioniChat.getContentPane().add(splitPaneMain, BorderLayout.CENTER);

        JScrollPane scrollPaneOpzioniFiltri = new JScrollPane();
        splitPaneMain.setLeftComponent(scrollPaneOpzioniFiltri);

        JPanel pnlOpzioniFiltri = new JPanel();
        scrollPaneOpzioniFiltri.setViewportView(pnlOpzioniFiltri);
        pnlOpzioniFiltri.setLayout(new BoxLayout(pnlOpzioniFiltri, BoxLayout.Y_AXIS));

        JPanel pnlOpzioni = new JPanel();
        pnlOpzioniFiltri.add(pnlOpzioni);
        pnlOpzioni.setBorder(new TitledBorder(new LineBorder(new Color(0, 0, 0)), "Opzioni", TitledBorder.LEADING, TitledBorder.TOP, null, null));
        pnlOpzioni.setLayout(new BoxLayout(pnlOpzioni, BoxLayout.X_AXIS));

        chckbxAggiornaAutomaticamente = new JCheckBox("Aggiorna Automaticamente");
        chckbxAggiornaAutomaticamente.setSelected(true);
        pnlOpzioni.add(chckbxAggiornaAutomaticamente);
        chckbxAggiornaAutomaticamente.setVerticalAlignment(SwingConstants.TOP);

        JButton btnAggiorna = new JButton("Aggiorna");
        btnAggiorna.addActionListener(new AggiornaListener());
        pnlOpzioni.add(btnAggiorna);

        Component verticalStrut_1 = Box.createVerticalStrut(20);
        pnlOpzioniFiltri.add(verticalStrut_1);

        pnlFiltri = new JPanel();
        pnlOpzioniFiltri.add(pnlFiltri);
        pnlFiltri.setBorder(new TitledBorder(new LineBorder(new Color(0, 0, 0)), "Filtri", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
        pnlFiltri.setLayout(new BoxLayout(pnlFiltri, BoxLayout.Y_AXIS));

        JLabel lblDa = new JLabel("Da");
        pnlFiltri.add(lblDa);

        dateTimePickerDa = new DateTimePicker();
        dateTimePickerDa.setDateTimePermissive(LocalDateTime.now().withHour(8).withMinute(0));
        dateTimePickerDa.addDateTimeChangeListener(new DateTimeChangeListener() {

            @Override
            public void dateOrTimeChanged(DateTimeChangeEvent event) {
                aggiorna(dateTimePickerDa.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")), dateTimePickerA.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")));              
            }

        });
        pnlFiltri.add(dateTimePickerDa);

        Component verticalStrut = Box.createVerticalStrut(20);
        pnlFiltri.add(verticalStrut);

        JLabel lblA = new JLabel("A");
        pnlFiltri.add(lblA);
        dateTimePickerA = new DateTimePicker();
        dateTimePickerA.setDateTimePermissive(LocalDateTime.now());
        dateTimePickerA.addDateTimeChangeListener(new DateTimeChangeListener() {

            @Override
            public void dateOrTimeChanged(DateTimeChangeEvent event) {
                aggiorna(dateTimePickerDa.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")), dateTimePickerA.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")));              
            }

        });
        pnlFiltri.add(dateTimePickerA);

        Component verticalStrut_2 = Box.createVerticalStrut(20);
        pnlOpzioniFiltri.add(verticalStrut_2);

        aggiorna(dateTimePickerDa.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")), dateTimePickerA.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")));      

    }


    private class AggiornaListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            dateTimePickerDa.setDateTimePermissive(LocalDateTime.now().withHour(8).withMinute(0));
            dateTimePickerA.setDateTimePermissive(LocalDateTime.now());
            aggiorna(dateTimePickerDa.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")), dateTimePickerA.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")));
        }

    }


    @Scheduled(fixedDelay = 60000)
    private void aggiornaAutomaticamente() {
        if (chckbxAggiornaAutomaticamente.isSelected()) {
            System.out.println("Aggiorno automaticamente");
            dateTimePickerDa.setDateTimePermissive(LocalDateTime.now().withHour(8).withMinute(0));
            dateTimePickerA.setDateTimePermissive(LocalDateTime.now());
            aggiorna(dateTimePickerDa.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")), dateTimePickerA.getDateTimePermissive().format(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")));
        }
    }
}

Заранее спасибо за помощь.


person Francesco Piccolomini    schedule 21.02.2019    source источник
comment
Вы не можете обновлять компоненты пользовательского интерфейса из фоновых потоков, это необходимо делать через рабочий поток пользовательского интерфейса Swing. Для этого вы можете использовать SwingUtilities. stackoverflow.com/questions/26214693/   -  person Thilo    schedule 21.02.2019
comment
Прочтите о параллелизме в Swing.   -  person Sergiy Medvynskyy    schedule 21.02.2019
comment
О, спасибо! Я читаю две ссылки.   -  person Francesco Piccolomini    schedule 21.02.2019