Проверка и изменение состояний 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's
JCheckBox
выбран, чем он также будет установлен OtherFrame's
JCheckBox
выбран.
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
}
});
}
}