2012-03-17 80 views
2

我的目標是防止Swing中的setEnabled將我的JLabels和其他JComponents灰化成不可讀。 (其原因是我有另一種解決方案來指示啓用狀態 - 圖標。)爲什麼不可能有效地覆蓋Swing的setEnabled?

基於對我之前的問題之一的答案,我決定覆蓋setEnabled。然而,正如你將在下面發現的,儘管沒有任何超級(切換)的調用,但我的重寫setEnabled仍然會導致組件變灰。有人能解釋爲什麼看起來不可能有效地覆蓋setEnabled的行爲嗎?

public class ToggleLabel extends JLabel { 

private boolean toggle; 

public ToggleLabel(String text, boolean toggle) { 
    super(text); 
    setEnabled(toggle); 
} 

public ToggleLabel(Icon image, boolean toggle) { 
    super(image); 
    setEnabled(toggle); 
} 
@Override 
public void setEnabled(boolean toggle) { 
    this.toggle = toggle; 
    System.out.println("I am used"); 

} 
@Override 
public boolean isEnabled() { 
    return toggle; 
} 

}

+0

而不是更改啓用狀態,它是否有意義,只是_not show_ the [相關組件](http://stackoverflow.com/q/9707470/230513)? – trashgod 2012-03-18 03:44:56

回答

3

沒有什麼特別有秋千setEnabled功能,你可以重寫它像任何其他功能。在你的代碼中調用someToggleLabel.setEnabled(false)明顯會而不是禁用JLabel(通過基本的Java語義)。其他的一定是錯的。

如果您希望能夠禁用組件(因爲您認爲自從您說有其他方式顯示該組件),我建議您不要「禁用」swing禁用組件的機制,而是嘗試改變外觀和感覺如何。

你有沒有考慮使用JLabel.setDisabledIcon

相關問題,這可能對您有用:

+0

+1爲您提供有用的建議和相關鏈接。 – Arvanem 2012-03-17 23:38:10

3

我不知道爲什麼你這麼認爲,對於例如,拿t他的計劃:

package so; 

import java.awt.Color; 
import java.util.Arrays; 

import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class Example { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       JPanel p = new JPanel(); 
       ToggleLabel tl = new ToggleLabel("hello"); 
       p.add(tl); 
       tl.setBackground(Color.GREEN); 
       tl.setEnabled(false); 
       f.add(p); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.pack(); 
       f.setVisible(true);  
      } 
     }); 
    } 

    private static class ToggleLabel extends JLabel { 

     private boolean toggle; 

     public ToggleLabel(String s) { 
      super(s); 
     } 

     @Override 
     public void setEnabled(boolean toggle) { 
      this.toggle = toggle; 
      System.out.println("I am used"); 

     } 
     @Override 
     public boolean isEnabled() { 
      return toggle; 
     } 
    } 

} 

正如你所看到的, 「我已經習慣」 被打印,程序,運行的時候,是這樣的:

enter image description here

+0

感謝您花時間編碼。然而,灰色化的根本問題仍然存在。 ( – Arvanem 2012-03-17 23:27:29

+0

)你看過屏幕截圖嗎?看起來不是這樣的。 – MByD 2012-03-17 23:28:17

+0

感謝你上傳證據.Aioobe指出其他的東西肯定是錯的。 – Arvanem 2012-03-17 23:29:22

3

你的setEnabled()重寫工作在印刷聲明中指出。
爲了防止組件被禁用覆蓋的IsEnabled(),並返回true:如果你的問題是前景或背景顏色是不是你想要的,添加替代到setForeground或的setBackground

public boolean isEnabled() { 
    return true; 
} 
0

,放該方法中的斷點並通過調試器運行。然後,當斷點被擊中以確定問題時,查看堆棧。有時候,我發現setEditable的調用會導致我的問題。 HTH和祝你好運;)

0

我注意到,在不同的場合,我在我自己的組件上寫的覆蓋setEnabled方法(我通常從JPanel延伸)被稱爲實例化時間。當然,我自己的構造函數並沒有明確地調用它。

所以,這意味着JPanel或其祖先之一在其構造函數中調用setEnabled(可能是間接的)。

重寫在祖先的構造函數中調用的方法是很危險的,也許這是問題的原因。有關此問題的更多信息,請參見What's wrong with overridable method calls in constructors?

相關問題