Общий подход к таким проблемам - парадигма модель-представление-контроллер или модель-представление-презентатор.
В вашем коде я вижу
class Gradient extends JPanel {
private String wpl_test = "";
private String wpl1_status = "";
private String wpl2_status = "";
...
, т.е.непосредственно в вашем представлении.
Обычно лучше разделить такие аспекты, как данные (модель) и представление (JLabel, ...) и логика (контроллер / презентатор).
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class Model {
public static final String KEY_WPL_TEST = "wpl_test";
public static final String KEY_WPL1_STATUS = "wpl1_status";
public static final String KEY_WPL2_STATUS = "wpl2_status";
private String wpl_test = "";
private String wpl1_status = "";
private String wpl2_status = "";
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
/**
* The default constructor.
*/
public Model() {
super();
}
public String getWpl_test() {
return wpl_test;
}
public void setWpl_test(String wpl_test) {
PropertyChangeEvent event = new PropertyChangeEvent(this, KEY_WPL_TEST, this.wpl_test, wpl_test);
this.wpl_test = wpl_test;
pcs.firePropertyChange(event);
}
public String getWpl1_status() {
return wpl1_status;
}
public void setWpl1_status(String wpl1_status) {
PropertyChangeEvent event = new PropertyChangeEvent(this, KEY_WPL1_STATUS, this.wpl1_status, wpl1_status);
this.wpl1_status = wpl1_status;
pcs.firePropertyChange(event);
}
public String getWpl2_status() {
return wpl2_status;
}
public void setWpl2_status(String wpl2_status) {
PropertyChangeEvent event = new PropertyChangeEvent(this, KEY_WPL2_STATUS, this.wpl2_status, wpl2_status);
this.wpl2_status = wpl2_status;
pcs.firePropertyChange(event);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
pcs.addPropertyChangeListener(propertyName, listener);
}
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
pcs.removePropertyChangeListener(propertyName, listener);
}
}
Тогда, есть View
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class View extends JPanel {
private final JLabel jlWpl1_status;
private final JLabel jlWpl2_status;
private final JLabel jlWpl_test;
private final JButton jbUpdate;
/**
* The default constructor.
*/
public View() {
super();
jlWpl1_status = new JLabel();
jlWpl2_status = new JLabel();
jlWpl_test = new JLabel();
jbUpdate = new JButton("push me");
// arrange the view
this.setLayout(new BorderLayout());
this.add(jlWpl1_status, BorderLayout.EAST);
this.add(jlWpl_test, BorderLayout.CENTER);
this.add(jlWpl2_status, BorderLayout.WEST);
this.add(jbUpdate, BorderLayout.SOUTH);
}
public void display(Model model) {
jlWpl1_status.setText(model.getWpl1_status());
jlWpl2_status.setText(model.getWpl2_status());
jlWpl_test.setText(model.getWpl_test());
}
public JButton getJbUpdate() {
return jbUpdate;
}
}
И, наконец, контроллер или презентатор, как
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class Controller implements PropertyChangeListener {
/**
* The Constant WHAT.
*/
public static final String WHAT = "$Id$";
private final Model model;
private View view;
/**
* The default constructor.
*/
public Controller(Model model, View view) {
super();
this.model = model;
this.model.addPropertyChangeListener(this);
this.view = view;
this.view.display(model);
this.view.getJbUpdate().addActionListener(x -> {
model.setWpl_test("button pressed");
});
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
view.display(model);
}
}
Теперь, если есть основной метод / Application
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Application {
/**
* The default constructor.
*/
public Application() {
super();
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
View view = new View();
Model model = new Model();
frame.add(view);
frame.setSize(200, 200);
new Controller(model, view);
new Thread(() -> {
try {
Thread.sleep(5000L);
SwingUtilities.invokeLater(() -> {
model.setWpl1_status("somewpl1status");
model.setWpl2_status("somewpl2status");
model.setWpl_test("sometest");
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
frame.setVisible(true);
}
}
значенияавтоматически обновляются при вызове любого установщика модели, независимо от того, вызван ли он из потока или нажатием кнопки.