2013-04-05 2 views
0

У меня есть два кадра, frameA и frameB, в frameA Я добавляю одну кнопку с именем buttonA для отображения frameB и progressbar (setIndeterminate (false)), в frameB я добавляю одну кнопку с именем buttonB, я хочу, когда я нажимаю buttonB, ProgressBar в frameA.setindeterminate (истинный)Как изменить setIndeterminate jProgressbar в другом кадре

в frameA

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); 
} 

в frameB я использую этот код в случае buttonB щелкнул

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

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

+0

См (HTTP [Использование нескольких JFrames, хороший/плохой практике?]: //stackoverflow.com/a/9554657/418556) –

ответ

2

Это ...

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()); 
     } 
    } 
}); 

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

firePropertyChange("progressState", false, true); 

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

+0

congrats> 50k ............. – mKorbel

+1

Yee, наблюдал за этим какое-то время: D - он сидел на 49, 999: P – MadProgrammer

+0

и, вероятно, время, чтобы изменить аватар тоже :-) – mKorbel