Как отобразить изменяющийся текст в JLabel используя цикл for - PullRequest
0 голосов
/ 24 апреля 2019
public class UserInterface {
    OpenFile of = new OpenFile();

    JFrame jf = new JFrame("File Manager");
    JButton jb1 = new JButton("Open File");
    JLabel jl1 = new JLabel("Recommendations appear here");
    JLabel jl2 = new JLabel();
    JList<String> list;

    public void build() {

        DefaultListModel<String> str = new DefaultListModel<String>();

        for (int i = 0; i < of.f.length; i++) {
            str.addElement(of.f[i].getAbsolutePath());
        }

        list = new JList<String>(str);

        Border b = BorderFactory.createLineBorder(Color.black, 2);
        Font f = new Font("Arial", Font.BOLD, 20);

        jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                of.OpenFileMethod(list.getSelectedValue());
            }
        });

        jl1.setFont(f);
        jl1.setBorder(b);
        list.setFont(f);
        jf.add(jl1).setBounds(30, 100, 300, 200);
        jf.add(list).setBounds(400, 100, 300, 300);
        jf.add(jb1).setBounds(250, 300, 100, 50);
        jf.setLayout(null);
        jf.setSize(800, 800);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for (int i = 0; i < 100; i++) {
            jl1.setText("Loading.");
            jl1.setText("Loading...");
        }
    }
}

Проблема в цикле for, только установка последнего текста "loading ..." для JLabel Я хочу, чтобы он попал в петлю и напечатал ее 100 раз. Может быть, цикл завершается до запуска приложения Swing. какое-нибудь решение для этого?

1 Ответ

2 голосов
/ 24 апреля 2019

какое-нибудь решение для этого?

в этом нет ничего плохого, этот код отлично работает, но проблема здесь в том, что когда этот цикл выполняется, он выполняется в мгновение ока!

ваш лучший друг в этом случае - класс javax.swing.Timer

, и пример покажет вам, как его использовать и, надеюсь, решить вашу проблему, таймеры имеют собственный общий Thread, поэтому вам не нужно об этом беспокоиться, он будет работать без зависания вашего интерфейса или блокировки кода.

//this int determines the time delay for each time it executes it's actions
    private int delay = 20;
    private int times = 0;
    private String text = "Loading ";
    private Timer textTimer;
    private class TimerAction implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            times++;
            String theSetText = text;
            for (int i = 0; i < times; i++) {
                theSetText += ".";
            }
            if (times == 3) {
                times = 0;
            }
        }

    }

вы всегда можете добавить больше слушателей действия с помощью метода timer.addActioListener, и он тоже будет зациклен там.

для вашей проблемы просто добавьте приведенный выше код в ваш класс и добавьте замену цикла в вашем коде на

textTimer = new Timer (delay,new TimerAction ());
textTimer.start();

и когда наступит подходящий момент (как вы хотите), когда вы хотите, чтобы это прекратилось, просто наберите

textTimer.stop();

чтобы остановить работу таймера. вот ссылка, чтобы узнать больше о теме Как использовать Swing Timers

...