Java实时改变多个JFrame的不透明度

时间:2014-02-22 14:29:47

标签: java swing user-interface jframe

作为初学者,我正在制作一个系统信息项目。该项目有一个GUI时钟和另一个GUI报告:CPU,内存使用等。作为一项功能,我希望用户能够一次更改所有这些JFrame的不透明度。

程序组织在打开程序时,会弹出一个主菜单,然后用户可以打开时钟或CPU监视器。在主菜单上有一个组合框,其内容为:100%,90%,最低可达10%。我在组合框中添加了一个动作事件,然后将主菜单的不透明度设置为组合框的相应输出。

问题出在哪里。上述段落仅在时钟GUI未打开时才有效。如果我尝试更改主菜单和GUI时钟的不透明度,时钟会冻结,并且不透明度在任何GUI上都不会改变。

public void opacityComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
        int x = opacityComboBox.getSelectedIndex();
        switch(x) {
            case 0:
                break;
            case 1:
                opacity=10; // in the combo box the value shows 100%
                break;
            case 2:
                opacity=9;
                break;
            case 3:
                opacity=8;
                break;
            case 4:
                opacity=7;
                break;
            case 5:
                opacity=6;
                break;
            case 6:
                opacity=5;
                break;
            case 7:
                opacity=4;
                break;
            case 8:
                opacity=3;
                break;
            case 9:
                opacity=2;
                break;
            case 10:
                opacity=1; // in the combo box the value shows 10%
                break;
            default:
                opacity=10;
                break;
        }
        setOpacity();
        GuiClock guic = new GuiClock(); // being the class with the other GUI JFrame
        guic.setOpacity();
    }

public void setOpacity() {
        Main m = new Main();
        float fOpacity = (float)m.opacity/10;
        String sOpacity = Float.toString(fOpacity)+"f";
        this.setOpacity(Float.parseFloat(sOpacity));
    }

GUI时钟在线程上更新,上面的空隙是否会干扰线程?如果是这样,我应该制作另一个不断检查不透明度变化的线程,或者这只是通过额外的CPU来咀嚼。

我该怎么做,以便在组合框输入的所有GUI上不透明度发生变化?

注意:如果有更有效的方法来优化我的代码,或完全更改它,请告诉我。我只是想了解更多:)......

1 个答案:

答案 0 :(得分:2)

首先来看看这个主题:The Use of Multiple JFrames, Good/Bad Practice?。您应该只有一个JFrame并使用非模态JDialog代替。请查看How to Use Modality in Dialogs文章。

关于ActionListener实施,您可以通过以下方式高度简化代码:

@Override
public void actionPerformed(ActionEvent e) {
    JComboBox comboBox = (JComboBox)e.getSource();
    Integer selectedValue = (Integer)comboBox.getSelectedValue();
    Float opacity = Float.valueOf((float)(selectedValue / 100)); // if 10 then 0.1, 20 then 0.2, and so on
    // set the opacity to the frame and dialogs    
}

最后,通过这样做:

public void opacityComboBoxActionPerformed(java.awt.event.ActionEvent evt) {
    ...
    GuiClock guic = new GuiClock(); // being the class with the other GUI JFrame
    guic.setOpacity();
}

您不会更改所显示窗口的不透明度,而是创建一个新窗口。您需要保持对显示的GuiClock对象的引用,并更改此对象的不透明度。

这里也是如此:

public void setOpacity() {
    Main m = new Main();
    ...
}

要获得更好的帮助,请发布Minimal, Complete, Tested and Readable example