2011-10-03 107 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

相關問題