2011-04-21 118 views
0

我正在開發一個小型照片編輯應用程序,並希望在用戶加載圖像之前禁用JButtons,此時我希望按鈕變爲啓用(可點擊)。我的想法是添加一個布爾imageFound和一個圖像檢查器方法。如果布爾值爲false,則禁用按鈕,如果爲true,則啓用它們(在load image actionPerformed方法中將布爾值設置爲true)。我遇到的問題是,當運行應用程序,按鈕被禁用,因爲他們應該是,但是當我加載圖像,他們仍然會被禁用。我不知道如果也許我錯過了任何一段代碼來重新檢查圖像是否可用,從而啓用按鈕(在運行時ofc)。謝謝你的幫助。啓用/禁用JButtons

...BufferedImage effects = null; 
boolean bmpFound = false; 


public GUI() 
{   
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    this.initComponents(); 
    this.bmpChecker(); 
    this.addListeners();   
    this.setTitle("PicTweak"); 
    this.setSize(900, 600); 
    this.setVisible(true); 
} 

...else if(e.getSource() == loadItem) 
    {    
     try 
     { 
      imagePath = DialogIO.displayOpenDialog(); 
      effects = ImageInOut.loadImage(imagePath);     
      imageHolder.setIcon(new ImageIcon(effects)); 
      bmpFound = true; 
     } 

....public void bmpChecker() 
{ 
    if(bmpFound) 
    { 
     grayScale.setEnabled(true); 
     blur.setEnabled(true); 
     reset.setEnabled(true); 
     brightDark.setEnabled(true); 
     horFlip.setEnabled(true); 
     verFlip.setEnabled(true); 
     verHorFlip.setEnabled(true); 
    } 
    else 
    { 
     grayScale.setEnabled(false); 
     blur.setEnabled(false); 
     reset.setEnabled(false); 
     brightDark.setEnabled(false); 
     horFlip.setEnabled(false); 
     verFlip.setEnabled(false); 
     verHorFlip.setEnabled(false); 
    } 
} 
+2

約呈現出一些代碼是什麼? – Rom1 2011-04-21 08:57:50

+0

某些代碼段會有幫助。 – shihpeng 2011-04-21 09:02:10

+1

-1'一些代碼'或'代碼片段'。 +1 [SSCCE](http://pscode.org/sscce.html)。 – 2011-04-21 09:10:47

回答

5

當加載/卸載圖像,呼叫bmpChecker()之後,即

... 
try 
{ 
    imagePath = DialogIO.displayOpenDialog(); 
    effects = ImageInOut.loadImage(imagePath);     
    imageHolder.setIcon(new ImageIcon(effects)); 
    bmpFound = true; 
    bmpChecker(); 
} 
... 

一個更好的選擇將是噸添加偵聽器圖像加載,即對需要的控制每個控制或組爲了相應地更新它的狀態,你需要註冊一個監聽器,當圖像被加載或卸載時通知它。監聽器可以觸發相應控件的更新。

喜歡的東西:

class ImageEvent { 
    private boolean imageLoaded; //plus getter/setter and maybe initialized in constructor 
}  

interface ImageListener { 
    void imageChanged(ImageEvent e); 
} 

... 

List<ImageListener> listeners; 

... 

try 
{ 
    imagePath = DialogIO.displayOpenDialog(); 
    effects = ImageInOut.loadImage(imagePath);     
    imageHolder.setIcon(new ImageIcon(effects)); 
    bmpFound = true; 

    ImageEvent imgageEvent = new ImageEvent(); 
    imageEvent.setImageLoaded(true); 

    for(ImageListener l : listeners) { 
     l.imageChanged(imageEvent); 
    } 
} 

... 

和示例監聽器:

class JButtonImageListener implements ImageListener { 
    private JButton button; //plus getter/setter 

    public void imageChanged(ImageEvent e) { 
    button.setEnabled(e.isImageLoaded()); 
    } 
} 
+0

非常感謝,非常感謝! :d – Darren 2011-04-21 09:16:34