如何在其他框架中更改setIndeterminate jProgressbar

时间:2013-04-05 05:58:28

标签: java swing jframe jprogressbar

我有一个两帧,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);
}

但它没有用

1 个答案:

答案 0 :(得分:2)

此...

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

不能正常工作,你刚刚创建了另一个frameA的实例,这个实例是不可见的。它与当前打开的框架没有任何关系。

你可以通过多种方式实现这一目标......

你可以......

frameA的引用传递给frameB,作为frameB的构造函数调用的一部分。然后在您的actionPerformed方法中,您只需使用此引用来更改进度条状态。

但这会在frameAframeB之间产生紧密耦合,这会大大减少frameB

的重复使用

你可以......

提供一种方式,感兴趣的一方可以将ActionListener附加到frameB,这会在点击按钮时触发。

这假定工作流程并将组件暴露给外部来源(通过ActionEvent#getSource),这可能允许人们更改您的组件......

你可能应该......

触发PropertyChanged事件。

这可能是我提出的所有选项中最简单,最安全的。以这种方式使用属性更改侦听器意味着您不需要公开JProgressBarJButton或在两个帧之间生成紧密链接。

属性更改支持内置于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); 值以重置它)