Как динамически обновлять текст в Label, при его изменении в цикле (Java)?

191
20 марта 2018, 01:15

Есть два класса: Second и Third. Оба отображают окно JFrame. На первом окне есть только Label, на втором только Button. Вопрос: как при нажатии кнопки Button во втором окне сделать чтобы по циклу менялась надпись на Label в первом окне. Пока получается что надпись обновляется только в конце цикла ...

Собственно главный метод Main:

package com.company;
public class Main {
    public static void main(String[] args) {
        Second app = new Second();
        app.setVisible(true);
        Third app2 = new Third();
        app2.setVisible(true);
    }
}

Класс Second:

package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Second extends JFrame{
    public static JLabel label;
    Second(){
        super("Окно которым управляют");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(450, 300);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        label = new JLabel("0");
        panel.add(label);
        setContentPane(panel);
        setLocationRelativeTo(null);
    }
}

И класс Third:

package com.company;
import javax.swing.*;
import java.awt.*;
import static java.lang.Thread.sleep;
public class Third extends JFrame{
    Third(){
        super("Окно которое управляет");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(450, 300);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
       JButton button = new JButton("Запустить цикл");
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                buttonMouseClicked(evt);
            }
        });
        panel.add(button);
        setContentPane(panel);
        setLocationRelativeTo(null);
    }
    public void buttonMouseClicked(java.awt.event.MouseEvent evt) {
        for (int i =0; i <5; i++) {
            Second.label.setText("Number " + i);
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
Answer 1

Вам необходимо откорректировать метод buttonMouseClicked.
Так как отрисовка происходит в другом потоке, необходимо код обернуть в класс SwingWorker.
Как то так:

    public void buttonMouseClicked(java.awt.event.MouseEvent evt) {
        SwingWorker swingWorker = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {
                for (int i = 0; i < 5; i++) {
                    process(Arrays.asList("Number " + i));
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }
            @Override
            protected void process(List chunks) {
                Second.label.setText(String.valueOf(chunks.get(0)));
            }
        };
        swingWorker.execute();
    }

Очень полезная статья

Answer 2

Label(имею в виду имя объекта label).setText("");

Answer 3

Возможно поможет т.к сам недавно искал такой метод repaint(); перерисовывает фрэйм, тем самым обновляет надписи, добавь его в цикл и вуоля, если ты про это))

Answer 4

Благодаря ответу от ezhov_da нашел работающее решение. Вот мой рабочий код, может кому пригодится: Класс Third

package com.company;
import javax.swing.*;
import java.awt.*;
public class Third extends JFrame{
    public int i;
    Third(){
        super("Окно которое управляет");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(450, 300);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
       JButton button = new JButton("Запустить цикл");

        button.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                buttonMouseClicked(evt);
            }
        });
        panel.add(button);
        setContentPane(panel);
        setLocationRelativeTo(null);
    }
    public void buttonMouseClicked(java.awt.event.MouseEvent evt) {
        guiWithoutBrakes withoutBrakes =new guiWithoutBrakes();
        withoutBrakes.execute();
    }
    public class guiWithoutBrakes extends SwingWorker<Integer, Object> {
        private static final long SLEEP_TIME=1000;
        public int doSomeWork()
        {
            for (i =0; i <5; i++) {
                Second.label.setText("Number " + i);
                Second.label.revalidate();
                try {
                    Thread.sleep(SLEEP_TIME);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return 1;
        }
        @Override
        protected Integer doInBackground() {
            return new Integer(doSomeWork());
        }
    }
}
READ ALSO
циклический switch java

циклический switch java

Мне нужно сделать консольное меню, использовал обычный switch, но не знаю как сделать чтобы при выборе кейса, он выполнялся и после этого в консоли...

214
Итератор для бинарного дерева

Итератор для бинарного дерева

Всем приветЗадача реализовать бинарное дерево поиска

194
Работа инкремента в Java

Работа инкремента в Java

Возник вопрос по поводу работы Java инкремента, я не могу понять логику как он считает его в этих выражения:

152
JTable установка фокуса на ячейку

JTable установка фокуса на ячейку

Есть jtable (10строк 2 столбца), необходимо установить фокус на ячейку (примерно на 5 строку 1 столбца) Как сделать ?

152