启用/禁用JButton

时间:2011-04-21 08:55:23

标签: java swing jbutton

我正在开发一个小型照片编辑应用程序,并且希望禁用JButton直到用户加载图像,此时我希望按钮启用(可点击)。我的想法是添加一个布尔imageFound和一个图像检查器方法。如果boolean为false,则禁用按钮,如果为true,则启用它们(在load image actionPerformed方法中boolean设置为true)。我遇到的问题是,当运行应用程序时,按钮会被禁用,但是当我加载图像时,它们仍然会被禁用。我不知道是否可能缺少任何代码来重新检查图像是否可用,从而启用按钮(在运行时)。谢谢你的帮助。

...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);
    }
}

1 个答案:

答案 0 :(得分: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());
   }
}