Вот что я пытаюсь сделать: у меня есть swing gui с двумя JFrames. Первый имеет JCheckBox, а второй отображает некоторый текст. Также у второго есть javax.swing.Timer, который ожидает, чтобы флажок в первом кадре был нажат. После нажатия на него появится еще один текст. Он работает, если у меня есть только одно условие (установите флажок), и условие находится непосредственно в if-statement, например:
javax.swing.Timer timer = new javax.swing.Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ( otherGUI.jCheckBox.isSelected() ){
//add some text to second JFrame
timer.stop();
}
}
});
Теперь для поворота: это должно произойти не один раз, а несколько раз. Существует ArrayList таймеров, каждый со своим собственным текстом и условием, один из которых начинается за другим. Моя проблема: если я сохраняю условия как строки в ArrayList, они, кажется, оцениваются один раз в начале программы, поэтому условие сверху остается ложным даже тогда, когда я устанавливаю флажок. Вот мой фактический код:
SomeGUI gui = new SomeGUI();
ArrayList<javax.swing.Timer> timer = new ArrayList<javax.swing.Timer>();
ArrayList<String> text = new ArrayList<String>();
ArrayList<String> cond = new ArrayList<String>();
text.add("some text");
cond.add("gui.jCheckBox.isSelected()");
text.add("some more text");
cond.add(new Condition("true"));
//etc.
for ( int i = 0; i < text.size() - 1; i++ ){
int j = i;//not sure why this trick is necessary. i doesn't work later on
timer.add( new javax.swing.Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean bool = false;
try{
bool = Boolean.parseBoolean( cond.get(j) );
}
catch(Exception ex){}
if ( bool ){
addText(p, text.get(j+1));
timer.get(j).stop();
timer.get(j+1).start();
}
}
}));
}
timer.get(0).start();
Я уже попробовал ArrayList<Boolean>
для условий с тем же эффектом. Приведенный выше код просто представляет мое нынешнее состояние проб и ошибок. Надеюсь, что я смогу понять, чего я пытаюсь достичь. Итак, как я могу хранить логические выражения в списке/массиве и оценивать их в if-statement снова и снова во время выполнения и не только один раз при запуске программы?
В Java нет простой "оценки" строк. Это возможно, но на самом деле не "java style". См. Раздел Преобразование строки в код
Еще один вариант заключается в том, что ваши строки представляют имена методов (которые существуют на хорошо известном объекте); то вы можете использовать отражение для вызова этого метода на основе предоставленной строки. Но также, довольно уродливо.