我有两个框架,框架A和框架B,在框架A中,我添加一个带有名称按钮A的按钮以显示框架B和进度条(setIndefininate(false((,在框架B中我添加一个带有名称按钮B的按钮,我想在单击按钮B时,帧A中的进度条。
在帧 A 中
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 中我在事件按钮B单击中使用此代码
private void buttonBActionPerformed(java.awt.event.ActionEvent evt) {
frameA a= new frameA();
a.getProgressbar().setIndeterminate(true);
}
但它不起作用
这个...
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
值以重置它(