Булево выражение должно оцениваться во время выполнения по таймеру, реагируя на изменения в свинг-интерфейсе.

1

Вот что я пытаюсь сделать: у меня есть 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 снова и снова во время выполнения и не только один раз при запуске программы?

  • 1
    Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный завершенный проверяемый пример) или SSCCE (короткий, автономный, правильный пример).
Показать ещё 2 комментария
Теги:
timer
swing

1 ответ

0
Лучший ответ

В Java нет простой "оценки" строк. Это возможно, но на самом деле не "java style". См. Раздел Преобразование строки в код

Еще один вариант заключается в том, что ваши строки представляют имена методов (которые существуют на хорошо известном объекте); то вы можете использовать отражение для вызова этого метода на основе предоставленной строки. Но также, довольно уродливо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню