как изменить setIndeterminate jProgressbar в другом кадре

у меня есть два кадра, кадр A и кадр B, в кадре A я добавляю одну кнопку с именем buttonA, чтобы показать кадр B и индикатор выполнения (setIndeterminate (false)), в кадре B я добавляю одну кнопку с именем buttonB, я хочу, когда я нажимаю кнопку B, индикатор выполнения в frameA.setindeterminate(true)

в кадреА

frameB b;

public frameA() {
   initComponents();
   progressbar.setIndeterminate(false);
   b = new frameB();
}

public JProgressBar getProgressbar() {
   return progressbar;
}

private void buttonAActionPerformed(java.awt.event.ActionEvent evt) 
{                                       
    b.setVisible(true);
}

в фрейме B я использую этот код в событии buttonB clicked

private void buttonBActionPerformed(java.awt.event.ActionEvent evt) { 
    frameA a= new frameA();
    a.getProgressbar().setIndeterminate(true);
}

но это не сработало


person user2104104    schedule 05.04.2013    source источник
comment


Ответы (1)


Этот...

private void buttonBActionPerformed(java.awt.event.ActionEvent evt) { 
    frameA a= new frameA();
    a.getProgressbar().setIndeterminate(true);
}

Не сработает, вы только что создали еще один невидимый экземпляр frameA. Он не имеет отношения к фрейму, который в данный момент открыт.

Есть множество способов добиться этого...

Вы могли бы...

Передайте ссылку frameA на frameB как часть вызова конструктора для frameB. Затем в вашем методе actionPerformed вы просто используете эту ссылку для изменения состояния индикатора выполнения.

Но это создаст тесную связь между frameA и frameB, что значительно уменьшит повторное использование frameB.

Вы могли бы...

Обеспечьте средства, с помощью которых заинтересованная сторона может прикрепить ActionListener к frameB, которые будут срабатывать при нажатии кнопки.

Это предполагает рабочий процесс и предоставляет компоненты внешним источникам (через ActionEvent#getSource), что может позволить людям изменить ваш компонент...

Возможно, вам следует...

Запустить событие PropertyChanged.

Это, наверное, самый простой и безопасный из всех вариантов, которые я придумал. Использование прослушивателя изменения свойств таким образом означает, что вам не нужно выставлять напоказ JProgressBar, JButton или создавать тесную связь между двумя кадрами.

Поддержка изменения свойств встроена в Container, поэтому она есть у всех компонентов/элементов управления.

Например, вы прикрепите PropertyChangeListener к b при его построении.

b = new frameB();
b.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("progressState")) {
            progressbar.setIndeterminate((Boolean)evt.getNewValue());
        }
    }
});

Добавьте метод bFrame actionPerformed, вы просто вызовете...

firePropertyChange("progressState", false, true);

Когда вы хотите установить неопределенное состояние (вы можете поменять местами значения boolean, чтобы сбросить его, если хотите)

person MadProgrammer    schedule 05.04.2013
comment
Ага, смотрел это какое-то время :D - он сидел на 49 999 :P - person MadProgrammer; 05.04.2013
comment
и наверное пора менять аватарку тоже :-) - person mKorbel; 05.04.2013
comment
Пожалуйста, см. очень интересный пост о большинстве из нас (один пост о ссылках на учебник, следующий ответ с SSCCE), не обращайте внимания на то, что этот форум очень оскорбителен с различными ответами, полными ерунды от ...., просто я ненавижу этот форум - person mKorbel; 05.04.2013