Проверка и изменение состояний JLabel из другого окна в Java

Итак, у меня есть два окна, использующих два отдельных класса. Мой основной имеет многослойный JLabels, содержащий изображения, которые я хотел бы использовать с помощью команды setVisible, чтобы переключать их назад и вперед с помощью флажков, которые есть во втором окне. Я использовал windowbuilder для создания окон и визуальных элементов, поэтому код немного сбивает меня с толку. Я пытался сделать установщик и получатель, но затмение продолжает говорить мне "Синтаксическая ошибка на токене" логическое ", ожидаемое", которое не помогло. Возможно, я слишком долго просыпался, но я не могу понять, правильно ли я ставлю геттеры и сеттеры. Вот часть кода для моего главного окна.

public class ChristmasTree {

private JFrame frame;


/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ChristmasTree window = new ChristmasTree();
                window.frame.setVisible(true);
                ControlWindow.createWindow();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });



}



/**
 * Create the application.
 */
public ChristmasTree() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(200, 50, 500, 625);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLayeredPane layeredPane = new JLayeredPane();
    GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addComponent(layeredPane, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE)
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                .addGap(1)
                .addComponent(layeredPane, GroupLayout.DEFAULT_SIZE, 561, Short.MAX_VALUE))
    );

    JLayeredPane backGround = new JLayeredPane();
    backGround.setBounds(0, 0, 484, 586);
    layeredPane.add(backGround);

    JLayeredPane treePane = new JLayeredPane();
    layeredPane.setLayer(treePane, 0);
    treePane.setBounds(0, 0, 484, 586);
    layeredPane.add(treePane);

    JLabel treeLabel = new JLabel("");
    treePane.setLayer(treeLabel, 0);
    treeLabel.setIcon(new ImageIcon(ChristmasTree.class.getResource("/resources/tree.png")));
    treeLabel.setBounds(0, 0, 484, 586);
    treePane.add(treeLabel);



    JLayeredPane decorationsPane = new JLayeredPane();
    layeredPane.setLayer(decorationsPane, 2);
    decorationsPane.setBounds(0, 0, 484, 586);
    layeredPane.add(decorationsPane);
    decorationsPane.setVisible(true);


    JLabel starLabel = new JLabel("");
    starLabel.setIcon(new ImageIcon(ChristmasTree.class.getResource("/resources/star.png")));
    starLabel.setBounds(0, 0, 484, 586);
    decorationsPane.add(starLabel);
    starLabel.setVisible(false);

например, это starLabel здесь - я хочу использовать флажок, чтобы переключать его назад и вперед с видимого == true/false. Я не знаю, поможет ли это, но вот часть кода для второго окна.

public class ControlWindow extends ChristmasTree {

private JFrame frame;
private boolean isSnowSelected = false;


/**
 * Launch the application.
 */
public static void createWindow() {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ControlWindow window = new ControlWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public ControlWindow() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(700, 100, 455, 231);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    ChristmasTree myChristmasTree = new ChristmasTree();

    JLabel chooseLabel = new JLabel("");
    chooseLabel.setIcon(new ImageIcon(ControlWindow.class.getResource("/resources/message.png")));

    final JCheckBox chckbxSnow = new JCheckBox("Snow");
    chckbxSnow.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            if (isSnowSelected == false)
            {   

            }
            else if (isSnowSelected == true)
            {

            }

            if (isSnowSelected == true)
            {
                isSnowSelected = false;
            }
            else
            {
                isSnowSelected = true;
            }
        }
        });

весь isSnowSelected логический Я планировал сделать что-то еще, но если бы я мог просто получить возвращенный логический, я мог бы написать это намного проще. Есть идеи? Кстати, я очень благодарен всем, кто постоянно читает такие вопросы, как мой, приятно знать, что есть кто-то, кому на самом деле все равно.

3 ответа

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

public class ABC {

public JFrame frame;
private static boolean isSnowSelected = false;
private JLayeredPane layeredPane;
JLayeredPane backGround;
JLayeredPane treePane;
 JLayeredPane decorationsPane;
 JLabel starLabel;
JLabel treeLabel;
/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ABC window = new ABC();
                window.frame.setVisible(true);
                ABC window1 = new ABC();
                window1.frame.setVisible(true);
                ControlWindow.createWindow();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });



}

/**
 * Create the application.
 */
public ABC() {
    initialize();
   runth();
}
public void runth(){
    Thread th = new Thread() {
                    public void run() {
                        while (true) {
                            if (isSnowSelected) {
                                treeLabel.setVisible(true);
                                starLabel.setVisible(false);
                            } else {
                                treeLabel.setVisible(false);
                                starLabel.setVisible(true);
                            }
                        }

                    }
                };
                th.start();
}
public static boolean getSelected() {
    return isSnowSelected;
}

public static void setSelected(boolean value) {
    isSnowSelected = value;
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    try {
        frame = new JFrame();
        frame.setBounds(200, 50, 500, 625);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        layeredPane = new JLayeredPane();
        GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
        groupLayout.setHorizontalGroup(
                groupLayout.createParallelGroup(Alignment.LEADING)
                .addComponent(layeredPane, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE));
        groupLayout.setVerticalGroup(
                groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                .addGap(1)
                .addComponent(layeredPane, GroupLayout.DEFAULT_SIZE, 561, Short.MAX_VALUE)));

        backGround = new JLayeredPane();
        backGround.setBounds(0, 0, 484, 586);
        layeredPane.add(backGround);

        treePane = new JLayeredPane();
        layeredPane.setLayer(treePane, 0);
        treePane.setBounds(0, 0, 484, 586);
        layeredPane.add(treePane);

         treeLabel = new JLabel("");
        treePane.setLayer(treeLabel, 0);
        treeLabel.setIcon(new ImageIcon(ABC.class.getResource("/resources/tree.png")));
        treeLabel.setBounds(0, 0, 484, 586);
        treePane.add(treeLabel);



        decorationsPane = new JLayeredPane();
        layeredPane.setLayer(decorationsPane, 2);
        decorationsPane.setBounds(0, 0, 484, 586);
        layeredPane.add(decorationsPane);
        decorationsPane.setVisible(true);


         starLabel = new JLabel("");
        starLabel.setIcon(new ImageIcon(ABC.class.getResource("/resources/star.png")));
        starLabel.setBounds(0, 0, 484, 586);
        decorationsPane.add(starLabel);
        starLabel.setVisible(true);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

}

public class ControlWindow extends ABC {



/**
 * Launch the application.
 */
public static void createWindow() {

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ControlWindow window = new ControlWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public ControlWindow() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    try{
    frame = new JFrame();
    frame.setBounds(700, 100, 455, 231);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



    final JCheckBox chckbxSnow = new JCheckBox("Snow");
     frame.add(chckbxSnow);
    chckbxSnow.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
           if(chckbxSnow.isSelected()){
               setSelected(true);
           }else{
               setSelected(false);
           }
        }
    });
}catch(Exception Ex){
      Ex.printStackTrace();
}
}
}

Оба окна не имеют связи в вашем коде. Вам нужно иметь reference главного окна в Child окно для установки Checkbox свойство главного окна при стрельбе actionPerformed() Метод. Лучший способ - это создать Delegate Класс между окном Main и Child, которое выполняет операцию включения / выключения Checkbox, В дополнение к этому, у вас есть только frame ссылка в Class уровень и все другие компоненты находятся в method уровень. Чтобы изменить свойства компонентов в окне, вы должны объявить их в Class уровень. Пожалуйста, создайте setters а также getters для всех компонентов окон. Это действительно поможет. Надеюсь это поможет

Пример кода, который поможет вам решить вашу проблему. Вот в примере, если MainFrame'sJCheckBox выбран, чем он также будет установлен OtherFrame'sJCheckBox выбран.

public class MainFrame extends JFrame {

        private OtherFrame c = null;
        JCheckBox checkbox = new JCheckBox();

        public MainFrame() {
            addActionListener();
        }

        public void setC(OtherFrame c) {
            this.c = c;
        }

        private void addActionListener() {
            checkbox.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //performs operation
                    if (checkbox.isSelected()) {
                        c.checkbox.setSelected(true);
                    }

                }
            });
        }
    }

    public class OtherFrame extends JFrame {

        JCheckBox checkbox = new JCheckBox();

        public OtherFrame() {
            addActionListener();
        }

        private void addActionListener() {
            checkbox.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //performs operation
                }
            });

        }
    }
Другие вопросы по тегам