我的目标是防止Swing中的setEnabled将我的JLabels和其他JComponents灰显为不可读。(这样做的原因是我有另一个解决方案来指示已启用的状态图标。)
基于对我之前一个问题的回答,我决定重写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;
}}
发布于 2012-03-18 10:18:30
启用/禁用的外观由所选外观的组件的UI委托控制。例如,按钮的委托通常派生自javax.swing.plaf.ButtonUI。
发布于 2012-03-18 07:22:34
Swings的setEnabled函数没有什么特别之处,你可以像其他函数一样覆盖它。在代码中调用someToggleLabel.setEnabled(false)显然不会禁用JLabel (根据基本的Java语义)。一定是别的什么地方出了问题。
如果您希望能够禁用组件(因为您说您有另一种显示它的方式),我建议您不要“禁用”swing提供的禁用组件的机制,而是尝试更改一些外观和感觉。
例如,您是否考虑过使用JLabel.setDisabledIcon
你可能会发现有用的与相关的问题:
发布于 2012-03-18 07:23:07
我不知道你为什么这么想,例如,以这个程序为例:
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;
}
}
}正如您所看到的,"I is used“被打印出来,程序在运行时看起来像这样:

https://stackoverflow.com/questions/9754631
复制相似问题