我有一个两帧,frameA和frameB,在frameA中我添加了一个名为buttonA的按钮来显示frameB和progressbar(setIndeterminate(false)),在frameB中我添加了一个名为buttonB的按钮,我希望当我点击buttonB,frameA.setindeterminate(true)中的进度条
在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中我在事件按钮B中单击
使用此代码private void buttonBActionPerformed(java.awt.event.ActionEvent evt) {
frameA a= new frameA();
a.getProgressbar().setIndeterminate(true);
}
但它没有用
答案 0 :(得分: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());
}
}
});
添加bFrame
的{{1}}方法,您可以简单地调用...
actionPerformed
如果要设置不确定状态(如果需要,可以交换firePropertyChange("progressState", false, true);
值以重置它)