Java JTextPane未显示正确的前景色

Java JTextPane未显示正确的前景色,java,swing,colors,jtextpane,Java,Swing,Colors,Jtextpane,希望有一个JTextPane,其内容始终可以由用户选择。因此,我创建了自己的JTextPane子类,并始终在方法“isEnabled()”中返回true。此外,我还引入了一个新成员m_enabled,负责返回正确的前景色(启用/禁用) 现在的问题是前景色没有改变。文本窗格总是被禁用。然而,“getForeground”中的调试信息显示如下 setting textpane enabled to true foreground color: javax.swing.plaf.ColorUIReso

希望有一个JTextPane,其内容始终可以由用户选择。因此,我创建了自己的JTextPane子类,并始终在方法“isEnabled()”中返回true。此外,我还引入了一个新成员m_enabled,负责返回正确的前景色(启用/禁用)

现在的问题是前景色没有改变。文本窗格总是被禁用。然而,“getForeground”中的调试信息显示如下

setting textpane enabled to true
foreground color: javax.swing.plaf.ColorUIResource[r=0,g=0,b=0]
setting textpane enabled to false
foreground color: javax.swing.plaf.ColorUIResource[r=109,g=109,b=109]
在我看来这没问题,但文本窗格总是看起来很糟糕


你有什么想法吗?

看起来你在
ActionListener
中缺少了一个
repaint()
调用。我不能说更多,因为您没有MyPane类的可用代码:)

super。getForeground()
在下一次调用中返回禁用的颜色,因为一旦将其设置为禁用的颜色,它也将传播到super类,如下所示:

下面是直接来自
JComponent

public void setForeground(Color fg) {
    Color oldFg = getForeground();
super.setForeground(fg);
if ((oldFg != null) ? !oldFg.equals(fg) : ((fg != null) && !fg.equals(oldFg))) {
    // foreground already bound in AWT1.2
    repaint();
}
}

无需重写getForeground()方法,只需从setEnabled()方法调用setForeground()方法即可

在更新前将默认前景色存储在某个位置,并在以后的调用中使用它

你能试试这个吗

class MyPane extends JTextPane {

    private static final long serialVersionUID = 1L;
    private boolean m_enabled = true;
    private Color defaultForegroundColor, disabledTextColor;

    public MyPane() {
        defaultForegroundColor = getForeground();
        disabledTextColor = getDisabledTextColor();
    }

    public void setEnabled(boolean enabled) {
        m_enabled = enabled;

        if (m_enabled) {
            setForeground(defaultForegroundColor);
        } else {
            setForeground(disabledTextColor);
        }
    }

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

第三次单击按钮,您将发现它
前景颜色:javax.swing.plaf.ColorUIResource[r=109,g=109,b=109]
,用于所有后续单击。
class MyPane extends JTextPane {

    private static final long serialVersionUID = 1L;
    private boolean m_enabled = true;
    private Color defaultForegroundColor, disabledTextColor;

    public MyPane() {
        defaultForegroundColor = getForeground();
        disabledTextColor = getDisabledTextColor();
    }

    public void setEnabled(boolean enabled) {
        m_enabled = enabled;

        if (m_enabled) {
            setForeground(defaultForegroundColor);
        } else {
            setForeground(disabledTextColor);
        }
    }

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