【问题标题】:Enabling/Disabling JButtons启用/禁用 JButton
【发布时间】:2011-04-21 17:37:21
【问题描述】:

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

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

【问题讨论】:

  • 显示一些代码怎么样?
  • 一些代码 sn-p 会有所帮助。
  • -1 '一些代码'或'代码 sn-p'。 +1 SSCCE.

标签: java swing jbutton


【解决方案1】:

当您加载/卸载图像时,之后调用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());
   }
}

【讨论】:

  • 非常感谢,非常感谢! :D
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多