2014-02-22 41 views
0

我正在做一個系統信息項目,作爲初學者。該項目有一個GUI時鐘和另一個GUI,它報告:CPU,內存使用情況等。作爲一項功能,我希望用戶能夠一次更改所有這些JFrame的不透明度。實時更改多個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上的不透明度發生變化?

注意:如果有更有效的方法來優化我的代碼,或完全改變它,請告訴我。我只是想了解更多:))

+2

我不知道其他人,但我不明白我們如何可以幫助你這樣的代碼片段。如果我們有機會了解您的問題,我相信您將不得不創建併發布[最小,可編譯,可運行的示例程序](http://stackoverflow.com/help/mcve)和幫助。 –

回答

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

+1

1+重新創建新對象,但我仍然困惑他爲什麼他的代碼會導致他的小GUI的鎖定。我想這就是需要一個mcve的部分。 –

+1

完全同意。我已經鏈接了MCTRE頁面,鼓勵OP發佈一個示例。也有投票結束,因爲我們不能提供任何建議。 @HovercraftFullOfEels – dic19