2011-10-03 97 views
3

我正在用Java开发一个使用NetBeans IDE的项目,我需要禁用特定的JButton。我使用下面的代码。如何在不隐藏标签的情况下禁用JButton?

IssuBtn.setEnabled(false); 

但它被禁用后,它不显示JButton上的文本。我如何在JButton上保留该文本?

+2

'setEnabled(false)'不要从按钮中删除文本,你必须在你的代码中有一些其他的错误。 –

+2

您可以发布SSCCE(http://sscce.org/),因为这是不寻常的。谢谢 – doNotCheckMyBlog

+5

通常情况下,文本仍然存在,尽管灰色表示不同的阴影。你确定不是这样吗?如果是这样,你使用什么样的外观和感觉,或者如果你使用的是标准,你使用的是什么操作系统和窗口管理器? –

回答

12

本实验建议一个答案是'使用不是金属的PLAF'。

Look Of Disabled Buttons

import java.awt.*; 
import javax.swing.*; 

class LookOfDisabledButton { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel gui = new JPanel(new BorderLayout(3,3)); 
       JPanel pEnabled = new JPanel(new GridLayout(1,0,2,2)); 
       pEnabled.setBackground(Color.green); 
       gui.add(pEnabled, BorderLayout.NORTH); 

       JPanel pDisabled = new JPanel(new GridLayout(1,0,2,2)); 
       pDisabled.setBackground(Color.red); 
       gui.add(pDisabled, BorderLayout.SOUTH); 

       UIManager.LookAndFeelInfo[] plafs = 
        UIManager.getInstalledLookAndFeels(); 
       for (UIManager.LookAndFeelInfo plafInfo : plafs) { 
        try { 
         UIManager.setLookAndFeel(plafInfo.getClassName()); 
         JButton bEnabled = new JButton(plafInfo.getName()); 
         pEnabled.add(bEnabled); 
         JButton bDisabled = new JButton(plafInfo.getName()); 
         bDisabled.setEnabled(false); 
         pDisabled.add(bDisabled); 
        } catch(Exception e) { 
         e.printStackTrace(); 
        } 
       } 

       JOptionPane.showMessageDialog(null, gui); 
      } 
     }); 
    } 
} 

可替换地,在UIManager调整值。

UIManager tweak

import java.awt.*; 
import javax.swing.*; 

class LookOfDisabledButton { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel gui = new JPanel(new BorderLayout(3,3)); 
       JPanel pEnabled = new JPanel(new GridLayout(1,0,2,2)); 
       pEnabled.setBackground(Color.green); 
       gui.add(pEnabled, BorderLayout.NORTH); 

       JPanel pDisabled = new JPanel(new GridLayout(1,0,2,2)); 
       pDisabled.setBackground(Color.red); 
       gui.add(pDisabled, BorderLayout.SOUTH); 

       // tweak the Color of the Metal disabled button 
       UIManager.put("Button.disabledText", new Color(40,40,255)); 

       UIManager.LookAndFeelInfo[] plafs = 
        UIManager.getInstalledLookAndFeels(); 
       for (UIManager.LookAndFeelInfo plafInfo : plafs) { 
        try { 
         UIManager.setLookAndFeel(plafInfo.getClassName()); 
         JButton bEnabled = new JButton(plafInfo.getName()); 
         pEnabled.add(bEnabled); 
         JButton bDisabled = new JButton(plafInfo.getName()); 
         bDisabled.setEnabled(false); 
         pDisabled.add(bDisabled); 
        } catch(Exception e) { 
         e.printStackTrace(); 
        } 
       } 

       JOptionPane.showMessageDialog(null, gui); 
      } 
     }); 
    } 
} 

正如指出的克列奥帕特拉..

它不是一个解决方案,但可能是一个指针的方向寻找一个解决方案

这是我的答案。事实上,我怀疑她打了真正的原因与评论:

只能猜测:这是由于违反一个平台的规则。

我第二个猜测。

+0

实际上,没有(虽然我在检查之前上传了,现在不能删除它:-) - 它看起来更像是一个来自不完整(?)平面设置的人工制品。正如你所看到的,即使启用的按钮看起来不对。具体来说:如果我按照原样运行示例,则看到与屏幕截图相同的示例。如果我改变它只设置金属(仅2按钮)所有看起来像预期 – kleopatra

+0

@kleopatra我明白你的意思(这是一个相当意外的结果)。 (划痕头)任何想法,为什么它的行为?至于实际问题,我想它回到了SkeetOverFlow的好建议--OP应该发布一个SSCCE。 –

+0

对于为什么只有猜测没有明确的想法:在这里,这是由于提炼一个平台的规则。然而,它是不稳定的:添加金属按钮作为最后一切都很好。这个例子的好处在于可以重现OPs效果_can_,再次如此:-) – kleopatra

相关问题