gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:10:17 26 4
gpt4 key购买 nike

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

程序的组织方式是,当您打开程序时,会弹出一个主菜单,然后用户可以打开时钟或CPU监视器。主菜单上有一个组合框,上面写着:100%、90% 等,低至 10%。我向组合框添加了一个 Action 事件,然后将主菜单的不透明度设置为组合框的相应输出。

问题就出在这里。上面的段落仅在时钟 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时钟在线程上更新,那么上面的void会干扰线程吗?如果是这样,我应该创建另一个线程来不断检查不透明度的变化,还是会消耗额外的 CPU。

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

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

最佳答案

首先看一下这个主题: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 .

关于Java实时改变多个JFrame的不透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21955665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com