Изменение значков меток в затмении с взаимодействием потоков - PullRequest
0 голосов
/ 07 марта 2011

В настоящее время я разрабатываю интерактивный пользовательский интерфейс, который показывает вам, включили ли вы компонент воды или освещения тепличной системы.

У меня довольно сложная задача изменить значки меток при нажатии кнопки из другого окна, которое передает значения своих флагов в класс потока, что, в свою очередь, приводит к изменению иконки

Контроллер -> ThreadLogic -> NewSim

вот несколько примеров тестовых кодов, которые я использовал в окне пользовательского интерфейса я все еще новичок, поэтому я использую автоматически сгенерированные коды из eclipse

Кажется, есть некоторые проблемы с вставкой кода

это фрагмент кода теста, который я использую для изменения значений флага

ThreadLogic

while(!t.interrupted()){

            sim = new NewSim();
            try {
                sim.setLightStatus(1);
                System.out.println("flag is 1");
                t.sleep(5000);

                sim.setLightStatus(0);
                System.out.println("flag is 0");
                t.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


    }

NewSim

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.dyno.visual.swing.layouts.Constraints;
import org.dyno.visual.swing.layouts.GroupLayout;
import org.dyno.visual.swing.layouts.Leading;

//VS4E -- DO NOT REMOVE THIS LINE!
public class NewSim extends JFrame {

    private static final long serialVersionUID = 1L;
    protected JLabel water;
    protected JLabel light;
    Icon waterIcon = null;
    Icon lightIcon = null;  
    private int lightFlag = 0;
    private JPanel iconPane;
    private static final String PREFERRED_LOOK_AND_FEEL = "javax.swing.plaf.metal.MetalLookAndFeel";

    public NewSim() {
        initComponents();
    }

    private void initComponents() {
        setLayout(new GroupLayout());
        add(getIconPane(), new Constraints(new Leading(4, 313, 10, 10), new Leading(4, 232, 10, 10)));
        setSize(320, 240);
    }

    private JPanel getIconPane() {
        if (iconPane == null) {
            iconPane = new JPanel();
            iconPane.setLayout(new GroupLayout());
            iconPane.add(getWaterLabel(), new Constraints(new Leading(163, 10, 10), new Leading(79, 12, 12)));
            iconPane.add(getLightLabel(), new Constraints(new Leading(115, 12, 12), new Leading(79, 12, 12)));
        }
        return iconPane;
    }

    private JLabel getLightLabel() {
        if (light == null) {
            light = new JLabel();
            System.out.println(this.lightFlag);
            setLightStatus(0); 

        }
        return light;
    }

    private JLabel getWaterLabel() {
        if (water == null) {
            water = new JLabel();
            water.setIcon(new ImageIcon(getClass().getResource("/images/wateroff.png")));
        }
        return water;
    }
    public void setLightStatus(int lightFlag2) {
        // TODO Auto-generated method stub
        this.lightFlag = lightFlag2;
        switch(this.lightFlag){
            case 0: System.out.println("case 0");
                    light.setIcon(new ImageIcon(getClass().getResource("/images/lightoff.png")));
                    light.revalidate();
                    break;
            case 1: System.out.println("case 0");
                    light.setIcon(new ImageIcon(getClass().getResource("/images/lighton.png")));
                    light.revalidate();
                    break;
        }
    }
}

1 Ответ

0 голосов
/ 07 марта 2011

В Swing вы не можете создавать или изменять компонент Swing ни в одном из потоков, кроме потока диспетчеризации событий (EDT).

Следующие строки должны быть выполнены в EDT:

sim = new NewSim();
sim.setLightStatus(1);
sim.setLightStatus(0);

Используйте SwingUtilities.invokeLater () для выполнения некоторого кода в EDT, а не в текущем (не EDT) потоке. И прочитайте предупреждение, присутствующее в Javadoc всех компонентов колебания: http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading

...