Есть два класса: 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();
}
}
}
}
Вам необходимо откорректировать метод 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();
}
Очень полезная статья
Label(имею в виду имя объекта label).setText("");
Возможно поможет т.к сам недавно искал такой метод repaint(); перерисовывает фрэйм, тем самым обновляет надписи, добавь его в цикл и вуоля, если ты про это))
Благодаря ответу от 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());
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне нужно сделать консольное меню, использовал обычный switch, но не знаю как сделать чтобы при выборе кейса, он выполнялся и после этого в консоли...
Возник вопрос по поводу работы Java инкремента, я не могу понять логику как он считает его в этих выражения:
Есть jtable (10строк 2 столбца), необходимо установить фокус на ячейку (примерно на 5 строку 1 столбца) Как сделать ?