0

我有两个框架,frameA 和 frameB,在 frameA 中我添加一个名为 buttonA 的按钮以显示 frameB 和进度条(setIndeterminate(false)),在 frameB 中我添加一个名为 buttonB 的按钮,当我单击 buttonB 时,我想要进度条在 frameA.setindeterminate(true)

在框架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);
}

在 frameB 中,我在事件 buttonB 中使用此代码单击

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

但它没有用

4

1 回答 1

2

这个...

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

行不通,您刚刚创建了另一个frameA不可见的实例。它与当前打开的框架没有关系。

有很多方法可以实现这一目标......

你可以...

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

但这会造成两者之间的紧密耦合frameAframeB这将大大减少frameB

你可以...

提供一种方法,当单击按钮时,相关方可以附加一个将触发的方法ActionListenerframeB

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

你应该...

触发一个PropertyChanged事件。

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

属性更改支持是内置的,Container因此所有组件/控件都有它。

例如,您将在构造它时附加一个PropertyChangeListenerto 。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'sactionPerformed方法,您将简单调用...

firePropertyChange("progressState", false, true);

当您想设置不确定状态时(如果您愿意,可以交换boolean值以重置它)

于 2013-04-05T06:14:11.143 回答